函数绑定的目的 我正在学习C++ Boost库的ASIO编程。我还遇到了许多使用函数bind()的例子,函数bind()以函数指针作为参数

函数绑定的目的 我正在学习C++ Boost库的ASIO编程。我还遇到了许多使用函数bind()的例子,函数bind()以函数指针作为参数,c++,boost,bind,C++,Boost,Bind,我一直无法理解bind()函数的用法。这就是为什么我很难理解使用boost库asio的程序 我不是在这里寻找任何代码。我只想知道bind()函数或其任何等价函数的用法。 提前感谢。您发布到boost::asio服务的任务必须可以零参数调用,以便该服务可以存储它们,并在有空闲资源(即空闲线程)时调用它们。假设您希望它调用函数void purr(int kitty),为了以服务可以使用的格式将其提供给服务,您需要将kitty参数绑定到purr函数。这将为您提供一个对象,该对象可以通过()调用,而您不

我一直无法理解bind()函数的用法。这就是为什么我很难理解使用boost库asio的程序

我不是在这里寻找任何代码。我只想知道bind()函数或其任何等价函数的用法。
提前感谢。

您发布到
boost::asio
服务的任务必须可以零参数调用,以便该服务可以存储它们,并在有空闲资源(即空闲线程)时调用它们。假设您希望它调用函数
void purr(int kitty)
,为了以服务可以使用的格式将其提供给服务,您需要将
kitty
参数绑定到
purr
函数。这将为您提供一个对象,该对象可以通过
()
调用,而您不能向服务提供任何参数

当然,对于C++11和lambda函数,现在最好的方法是执行
io_service.post([&](){purr(3);})并避免同时使用
bind

来自

函数模板绑定为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;
}

它允许您将自己的数据与希望库调用的函数相关联(或“绑定”),而库不需要了解您的数据

既然你在看Boost.Asio,看看他们的。它们有一个要用作处理程序的函数,需要指向自身数据的指针、计时器本身和计数器:

void print(const boost::system::error_code& /*e*/,
    boost::asio::deadline_timer* t, int* count)
{
    // ...
}
定时器的函数导致在定时器到期时调用用户提供的函数;但只提供了这些论点中的第一个。处理程序的格式如下所示

void handler(
    const boost::system::error_code& error // Result of operation.
);
因此,我们可以使用
bind
将函数(需要三个参数)转换为只需要一个参数的函数,方法是指定要作为其他两个参数传递的值:

t.async_wait(boost::bind(print,
    boost::asio::placeholders::error, &t, &count));
bind
的结果是一个函数对象(即,重载函数调用运算符的类类型的对象,
operator()
),在本例中,该类对象只接受一个参数。
占位符::error
参数表示第一个参数仍然是新函数类型的参数;调用新函数时,其他两个参数的值分别为
&t
&count
。因此,如果我们自己称之为:

auto f = boost::bind(print, boost::asio::placeholders::error, &t, &count)
f(some_error);
这与使用以下参数调用原始函数的效果相同:

print(some_error, &t, &count);

现在,当计时器过期时,将使用我们提供的参数调用我们的函数,而Asio库不需要知道任何关于它们的信息。

它将一个函数转换为另一个函数,其中一个或多个(或零个)参数是固定的。f(x,y)-->f(5,y)例如。对不起,我没把你弄清楚。可能会有帮助:
print(some_error, &t, &count);