c++之std::function


#include <functional>
#include <iostream>

/*
 
 这是c++11新添加的,使用时需要引入头文件#include <functional>
 
 std::function类模板是一个通用的多态函数封装器。 std::function对象可以存储、拷贝、调用任何可以调用的对象函数、lambda表达式、绑定表达式、函数对象,以及指向成员函数和数据成员的指针。
 被存储的、可调用的对象,被叫做std::function target。如果一个std::function没有包含target,则称其为空std::function,强行调用其target会导致bad_function_call的异常抛出。

 因为std::function是一种类模板,所以要传入类型,就如std::vector<int> 传入类型int一样;不过,std::function传入的是”函数返回类型 (参数类型列表)",  如:std::function<void(int)>
 */

void globalFunc()
{
    std::cout << "globalFunc" << std::endl;
}

//传入函数指针
void saveGlobalFuncAndCall(){
    std::function<void()> f = globalFunc;//std::function<void()> f(globalFunc)
    f();
}

template <class T>
T g_Add(T i, T j)
{
    std::cout << i + j << std::endl;
    return i + j;
}
 
 //传入模板函数指针
void saveTemplateFuncAndCall(){
    std::function<int(int,int)> f(g_Add<int>);//std::function<int(int,int)> f = g_Add<int>;
    f(6,3);
}

//传入Lambda Express(匿名类对象)
void saveLambdaExpressAndCall(){
    /*
    auto g_Lambda = [](int i, int j){
        return i + j;
    };
    
    std::function<int(int, int)> func(g_Lambda);//std::function<int(int, int)> func = g_Lambda;
    std::cout << func(5, 8) << std::endl;
    */
    
    /*
    std::function<int(int, int)> func = [](int i, int j){
        return i + j;
    };
    std::cout << func(5, 8) << std::endl;
    */
    
    std::function<int(int, int)> func([](int i, int j){
        return i + j;
    });
    std::cout << func(5, 8) << std::endl;
    
}

//函数对象
struct Add
{
    int operator()(int i, int j)
    {
        return i + j;
    }
};
 
//模板函数对象
template <class T>
struct AddT
{
    T operator()(T i, T j)
    {
        return i + j;
    }
};
 
//传入函数对象
void saveFunctionInstance(){
   std::function<int(int, int)> f = Add();
   std::cout<<f(2,3)<<std::endl;

   std::function<int(int, int)> ft = AddT<int>();
   std::cout << ft(5, 6)<<std::endl;
}

class Computer
{
public:
    static int Add(int i, int j)
    {
        return i + j;
    }
 
    template<class T>
    static T AddT(T i, T j)
    {
        return i + j;
    }
 
    int AddN(int i, int j)
    {
        return i + j;
    }
};
 
//存储类函数、类模板函数、实例对象成员函数并调用
void saveClassFunctionClassTemplateFunctionInstanceMemFunction(){
   //1、类函数
   std::function<int(int, int)> f = &Computer::Add;
   std::cout << f(1, 1) << std::endl;

   //2、类模板函数
   std::function<int(int, int)> ft = &Computer::AddT<int>;
   std::cout << ft(2, 3) << std::endl;

   //实例对象成员函数绑定  需要构造类对象
   Computer c;

   //3、实例对象成员函数,需使用bind,将类对象地址&c绑定上
   std::function<int(int, int)> fN = std::bind(&Computer::AddN, &c, std::placeholders::_1, std::placeholders::_2);
   std::cout << fN(1, 1) << std::endl;
}
 
int main(int argc, char** agrv)
{
    saveClassFunctionClassTemplateFunctionInstanceMemFunction();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值