使用 std::bind 并存储到 std:: 函数中
Use std::bind and store into a std:: function
我正在尝试使用 std::bind 绑定到一个函数并将其存储到我的 std::function 回调对象中。我写的代码是我实际代码的简化版本。下面的代码无法编译,说
_1 was not declared in the scope
注意:我知道同样可以使用 lambda 来完成。但是函数处理程序已经存在并且需要使用,否则我需要在 lambda 中调用处理程序。
#include <iostream>
#include <functional>
typedef std:: function<void(int)> Callback;
template <class T>
class Add
{
public:
Add(Callback c)
{
callback = c;
}
void add(T a, T b)
{
callback(a+b);
}
private:
Callback callback;
};
void handler(int res)
{
printf("result = %d\n", res);
}
int main(void)
{
// create a callback
// I know it can be done using lambda
// but I want to use bind to handler here
Callback c = std::bind(handler, _1);
/*Callback c = [](int res)
{
printf("res = %d\n", res);
};*/
// create template object with
// the callback object
Add<int> a(c);
a.add(10,20);
}
占位符在 std 命名空间中自己的命名空间中。
添加 using namespace std::placeholders
或使用 std::placeholders::_1
很好的例子:std::placeholders::_1, std::placeholders::_2, ..., std::placeholders::_N
占位符 _1
、_2
、_3
... 放置在命名空间 std::placeholders
中,您应该像
一样限定它
Callback c = std::bind(handler, std::placeholders::_1);
或者
using namespace std::placeholders;
Callback c = std::bind(handler, _1);
我正在尝试使用 std::bind 绑定到一个函数并将其存储到我的 std::function 回调对象中。我写的代码是我实际代码的简化版本。下面的代码无法编译,说
_1 was not declared in the scope
注意:我知道同样可以使用 lambda 来完成。但是函数处理程序已经存在并且需要使用,否则我需要在 lambda 中调用处理程序。
#include <iostream>
#include <functional>
typedef std:: function<void(int)> Callback;
template <class T>
class Add
{
public:
Add(Callback c)
{
callback = c;
}
void add(T a, T b)
{
callback(a+b);
}
private:
Callback callback;
};
void handler(int res)
{
printf("result = %d\n", res);
}
int main(void)
{
// create a callback
// I know it can be done using lambda
// but I want to use bind to handler here
Callback c = std::bind(handler, _1);
/*Callback c = [](int res)
{
printf("res = %d\n", res);
};*/
// create template object with
// the callback object
Add<int> a(c);
a.add(10,20);
}
占位符在 std 命名空间中自己的命名空间中。
添加 using namespace std::placeholders
或使用 std::placeholders::_1
很好的例子:std::placeholders::_1, std::placeholders::_2, ..., std::placeholders::_N
占位符 _1
、_2
、_3
... 放置在命名空间 std::placeholders
中,您应该像
Callback c = std::bind(handler, std::placeholders::_1);
或者
using namespace std::placeholders;
Callback c = std::bind(handler, _1);