std::function

    1. std::function

头文件:<functional>

函数声明:template< class R, class... Args >  class function<R(Args...)>;

描述:类模板std::function是一个通用目的的多态的函数封装。std::function可以存储、拷贝和唤醒任何可调用的目标----函数、lambda和bind表达式,或者其他函数对象,还有指向成员函数的指针和指向数据成员的指针。

存储的可调用的对象称之为std::function的目标。如果一个std::function没有包含目标,称之为empty。当唤醒一个empty std::function的目标时,会抛出异常。

Std::function满足了复制构造和复制赋值的需求。

 

成员函数:

  • (constructor): constructs a new std::function instance (public member function)
  • (destructor):destroys a std::function instance (public member function)
  • operator=  : assigns a new target (public member function)
  • Swap :swaps the contents (public member function)
  • Assign (until C++17) assigns a new target (public member function)
  • operator bool  :  checks if a valid target is contained (public member function)
  • operator() :  invokes the target  (public member function)

 

目标访问:

  • target_type : obtains the typeid of the stored target (public member function)
  • Target : obtains a pointer to the stored target (public member function)

 

非成员函数

  • std::swap(std::function) (C++11) pecializes the std::swap algorithm (function template)
  • operator==和operator!=  : compares a std::function with nullptr function template)

 

Helper classes:

  • std::uses_allocator<std::function> (C++11) (until C++17)  specializes the std::uses_allocator type trait (class template specialization) Deduction guides(since C++17)

 

举例:

 

#include <functional>

 

#include <iostream>

 

struct Foo {

    Foo(int num) : num_(num) {}

    void print_add(int i) const { std::cout << num_+i << '\n'; }

    int num_;

};

 

void print_num(int i)

{

    std::cout << i << '\n';

}

 

struct PrintNum {

    void operator()(int i) const

    {

        std::cout << i << '\n';

    }

};

 

int main()

{

    // store a free function

    std::function<void(int)> f_display = print_num;

    f_display(-9);

 

    // store a lambda

    std::function<void()> f_display_42 = []() { print_num(42); };

    f_display_42();

 

    // store the result of a call to std::bind

    std::function<void()> f_display_31337 = std::bind(print_num, 31337);

    f_display_31337();

 

    // store a call to a member function

    std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;

    const Foo foo(314159);

    f_add_display(foo, 1);

    f_add_display(314159, 1);

 

    // store a call to a data member accessor

    std::function<int(Foo const&)> f_num = &Foo::num_;

    std::cout << "num_: " << f_num(foo) << '\n';

 

    // store a call to a member function and object

    using std::placeholders::_1;

    std::function<void(int)> f_add_display2 = std::bind( &Foo::print_add, foo, _1 );

    f_add_display2(2);

 

    // store a call to a member function and object ptr

    std::function<void(int)> f_add_display3 = std::bind( &Foo::print_add, &foo, _1 );

    f_add_display3(3);

 

    // store a call to a function object

    std::function<void(int)> f_display_obj = PrintNum();

    f_display_obj(18);

 

}

 

输出:

-9

42

31337

314160

314160

num_: 314159

314161

314162

18

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值