函数绑定的目的

Be *_*dey 5 c++ boost bind

我正在学习c ++ Boost库的asio编程.我遇到过许多使用函数bind()的例子,它将函数指针作为参数.

我无法理解bind()函数的用法.这就是为什么我难以理解使用增强库asio的程序.

我不是在寻求任何代码.我只想知道bind()函数或其任何等效函数的使用.提前致谢.

Moh*_*ain 6

来自cppreference

函数模板绑定为f生成转发调用包装器.调用这个包装器等同于调用f,其中一些参数绑定到args.

检查下面示例演示绑定

#include <iostream>
#include <functional>

 using namespace std;

int my_f(int a, int b)
{
    return 2 * a + b;
}

int main()
{
    using namespace std::placeholders;  // for _1, _2, _3...

     // Invert the order of arguments
     auto my_f_inv = bind(my_f, _2, _1);        // 2 args b and a
    // Fix first argument as 10
    auto my_f_1_10 = bind(my_f, 10, _1);        // 1 arg b
    // Fix second argument as 10
    auto my_f_2_10 = bind(my_f, _1, 10);        // 1 arg a
    // Fix both arguments as 10
    auto my_f_both_10 = bind(my_f, 10, 10);     // no args

    cout << my_f(5, 15) << endl; // expect 25
    cout << my_f_inv(5, 15) << endl; // expect 35
    cout << my_f_1_10(5) << endl; // expect 25
    cout << my_f_2_10(5) << endl; // expect 20
    cout << my_f_both_10() << endl; // expect 30

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您可以使用bind来操作现有函数的参数顺序或修复一些参数.这在stl容器和算法中特别有用,您可以在其中传递其签名与您的需求匹配的现有库函数.

例如,如果您想将容器中的所有双打转换为2,那么您可以执行以下操作:

std::transform(begin(dbl_vec),
               end(dbl_vec),
               begin(dbl_vec),
               std::bind(std::pow, _1, 2));
Run Code Online (Sandbox Code Playgroud)

这里有实例