C++中functional包中function的使用

function 定义:wraps callable object of any type with specified function call signature (class template)

类模板std :: function是一个通用的多态函数包装器。 std :: function的实例可以存储,复制和调用任何可调用对象,如函数,lambda表达式,绑定表达式(bind)或其他函数对象,以及指向成员函数和指向数据成员的指针。

存储的可调用对象称为std::unction的target。 如果std :: function不包含target,则将其称为空。 调用空std :: function的target会导致抛出std :: bad_function_call异常。

std :: function满足CopyConstructible和CopyAssignable的要求。

 

常用通项语法: std::function<return-type(args-list)>  renamed_f = init_function_name;

以下列举了常见的几种应用场景

#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);
}

其实,上述的function表达完全可以用auto代替,这样也无需引入functional头文件

补充:

free function:The term free function in C++ simply refers to non-member functions, this is,  it is not associated with any class and hence could be called as free function. Every function that is not a member function is a free function.

struct X {
    void f() {}               // not a free function
};
void g() {}                   // free function
int h(int, int) { return 1; } // also a free function

延伸:function也可以用std::bind代替(引入头文件functional)

         auto bind_f = std::bind(printaa, placeholders::_1);

void print(char first, int other){
...
}
auto new_f = std::bind(print,placeholders::_1,placeholders::_2);

new_f('F', 2019);

参考:

[1] https://en.cppreference.com/w/cpp/language/templates

[2]  https://stackoverflow.com/questions/4861914/what-is-the-meaning-of-the-term-free-function-in-c

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++function是一个通用的函数封装器,它可以用来存储和调用任意可调用对象,包括函数、函数指针、成员函数和函数对象等。 使用function需要包含头文件<functional>。下面是一个示例: ```cpp #include <iostream> #include <functional> int add(int a, int b) { return a + b; } int main() { std::function<int(int, int)> func = add; std::cout << func(3, 4) << std::endl; // 输出结果为7 return 0; } ``` 在上面的示例,我们定义了一个名为`add`的函数,它接受两个整数参数并返回它们的和。然后,我们声明了一个`std::function`对象`func`,它可以接受两个整数参数并返回一个整数。我们将`add`函数赋值给`func`,然后通过调用`func`来执行加法操作。 除了函数,你还可以将其他可调用对象赋值给`std::function`,例如: ```cpp #include <iostream> #include <functional> struct Functor { int operator()(int a, int b) const { return a * b; } }; int main() { std::function<int(int, int)> func1 = [](int a, int b) { return a - b; }; std::function<int(int, int)> func2 = Functor(); std::cout << func1(5, 2) << std::endl; // 输出结果为3 std::cout << func2(5, 2) << std::endl; // 输出结果为10 return 0; } ``` 在这个示例,我们定义了一个函数对象`Functor`,它可以进行乘法操作。然后,我们声明了两个`std::function`对象`func1`和`func2`,分别赋值为lambda表达式和函数对象`Functor`。通过调用这两个`std::function`对象,我们可以执行减法和乘法操作。 使用`std::function`可以使代码更加灵活,可以将不同类型的可调用对象存储在同一类型的对象,并通过调用对象来执行相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Poo_Chai

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值