[C++11] function与bind

[C++11] function与bind

📑 简介

🐱 function

类模板std::function是一个通用的多态函数包装器。 std::function的实例可以存储,复制和调用任何可调用的目标,简而言之,是支持OP(...)操作的目标,如函数lambda表达式bind绑定表达式重载operator()的类对象类内数据成员等。包装器对象可以进行拷贝,并且包装器类型仅仅只依赖于其调用特征(call signature),而不依赖于可调用元素自身的类型。当std::function对象未包裹任何实际的可调用元素,调用该std::function对象将抛出std::bad_function_call异常。

Class that can wrap any kind of callable element (such as functions and function objects) into a copyable object, and whose type depends solely on its call signature (and not on the callable element type itself).

类声明
template <class T> function;     // undefined
template <class Ret, class... Args> class function<Ret(Args...)>;
成员函数
函数作用
(constructor)构造
(destructor)析构
operator=复制
assign复制
operator bool检查是否可调用
operator()调用目标
target_type目标类型
target获得目标指针
swap交换函数对象

🐶bind

std::bind可以根据当前已有的可调用对象,构造出一个新的可调用对象。

bind可以改变函数的参数顺序、固定参数值等。

函数声明
template <class Fn, class... Args> bind (Fn&& fn, Args&&... args);
template <class Ret, class Fn, class... Args> bind (Fn&& fn, Args&&... args);

📓 ​举例

🗒例子不全,仅供参考。(其中对于类数据成员的访问使用较少)

  • 普通函数构造function(含模板,以下省略模板)

    #include <functional>
    int add(int a, int b)
    {
        return a + b;
    }
    int main()
    {
        std::function<int(int, int)>funcAdd = add;
        auto sum = funcAdd(10, 30);
    
        _asm int 3;
        return 0;
    }
    
    #include <functional>
    
    template<typename T>
    T add(T a, T b)
    {
        return a + b;
    }
    int main()
    {
        std::function<int(int, int)>funcAdd = add<int>;
        auto sum = funcAdd(10, 30);
    
        _asm int 3;
        return 0;
    }
    
  • 函数对象构造function

    #include <functional>
    
    struct addFunctor
    {
    public:
        int operator() (int a, int b)
        {
            return a + b;
        }
    };
    int main()
    {
        addFunctor add;
        std::function<int(int, int)> funAdd = add;
        auto sum = funAdd(10, 50);
    
        _asm int 3;
        return 0;
    }
    
  • 类成员函数构造function

    #include <functional>
    
    class example
    {
    public:
        int add(int a, int b)
        {
            return a + b;
        }
    };
    int main()
    {
        example xp;
    
        std::function<int(example&, int, int)> funAdd = &example::add;
        auto sum = funAdd(xp, 10, 50);
    
        _asm int 3;
        return 0;
    }
    
  • 类静态成员函数构造function

    #include <functional>
    
    class example
    {
    public:
        static int add(int a, int b)
        {
            return a + b;
        }
    };
    int main()
    {
        std::function<int(int, int)> funAdd = &example::add;
        auto sum = funAdd(10, 50);
    
        _asm int 3;
        return 0;
    }
    
  • 类数据成员构造function

    #include <functional>
    
    class example
    {
    public:
        int data;
    };
    int main()
    {
        std::function<int(example&)> getData = &example::data;
    
        example xp;
        xp.data = 60;
    
        auto data = getData(xp);
    
        _asm int 3;
        return 0;
    }
    
  • lambda表达式构造function

    #include <functional>
    
    int main()
    {
        std::function<int(int, int)> funAdd = [](int a, int b) {return a + b; };
        auto sum = funAdd(10, 50);
    
        _asm int 3;
        return 0;
    }
    
  • bind表达式构造function

    #include <functional>
    
    class example
    {
    public:
        int add(int a, int b)
        {
            return a + b;
        }
    
        int data;
    };
    int main()
    {
        example xp;
        xp.data = 50;
    
        std::function<int(int, int)> funAdd = std::bind(&example::add, xp, std::placeholders::_1, std::placeholders::_2);
        std::function<int()> getXpData = std::bind(&example::data, xp);
    
        auto sum = funAdd(10, 50);
        auto data = getXpData();
    
        _asm int 3;
        return 0;
    }
    

Tips:

placeholdersstd命名空间内针对bind函数使用的占位符命名空间,用来指定参数的位置。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ohto-Ai

客官不可以白嫖哟~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值