C++11 的新特性5——统一函数对象的封装形式

发布时间:2024年01月18日

? 类模板?std::function?是通用多态函数包装器。?std::function?的实例能存储、复制及调用任何可复制构造?(CopyConstructible)?可调用?(Callable)?目标——函数(通过其指针)、?lambda 表达式、?bind 表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。

目录

函数包装器?

1、函数指针

2、仿函数

3、包装类内的方法

函数绑定器

1、bind类内成员函数时,改变调用接口的参数个数

2、绑定类外接口?

3、绑定仿函数


函数包装器?

1、函数指针

void func(int A)
{
    std::cout<<A<<std::endl;
}
// 统一函数对象的封装形式: 把函数对象看成一个变量
std::function<void(int)> f1=func;
f1(20);

2、仿函数

? ? ? ? 什么是仿函数: 定义一个类,类里面重载函数运算符(),将该类的对象作为函数的入参,那么在函数中同样能调用重载符()里面的方法

class Func
{
public:
? ? void operator()(int a){std::cout<<a<<std::endl;}
};
// 统一函数对象的封装形式: 把仿函数对象看成一个变量
std::function<void(int)> f2=Func();
f2(23);

3、包装类内的方法

class Test
{
public:
    Test(){ }
    Test(int numb):m_numb(numb){}
    int add(int a,int b,int c )const
    {
        return a+b+c;
    }

private:
    int m_numb;
};
//类内的方法, 
    /**
     * 对类内成员的函数,依赖于类的对象,所以需要一个类的对象
    */
std::function<int(const Test&, int,int,int)>f = &Test::add;
Test t;
std::cout<<f(t,2,3,4)<<std::endl;

函数绑定器

? ? ? ?注意:

?using namespace std; 全局使用注意事项
? ? ? ? 在C库和C++库中,出现同名的情况下,使用using namespace std;//标准库
? ? ? ? 会导致,无法使用C库的函数,所以在项目中少用全局标准库std

1、bind类内成员函数时,改变调用接口的参数个数

//bind类内成员函数时,改变调用接口的参数个数
    Test test_canshu;
    auto f_class_canshu = std::bind(&Test::add,&test_canshu,std::placeholders::_1,std::placeholders::_2,0);
    std::cout<<f_class_canshu(1,2)<<std::endl;

2、绑定类外接口?

// 绑定类外接口
    // 使用bind,和占位(placeholders) 配合使用,灵活控制参数的个数
    auto add_f = std::bind(add,std::placeholders::_1,std::placeholders::_2, 0);
    add_f(4,7); //两数相加

3、绑定仿函数

// 绑定仿函数
    // 把一函数变成另一个函数
    auto f_operator = std::bind(Func(),std::placeholders::_1);
    f_operator(5);
    f_operator(6);
文章来源:https://blog.csdn.net/weixin_70822378/article/details/135618172
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。