std :: bind无法按预期工作

时间:2012-09-10 01:29:13

标签: c++ c++11

std::vector<int> v1;
std::function<void(const int&)> funct = 
static_cast<std::function<void(const int&)>>(std::bind(
                                            &std::vector<int>::push_back,
                                            &v1,
                                            std::placeholders::_1));

这给了我no matching function for call to bind

我能做到这一点:

threadPool.push_back(std::thread(runThread<lazyFunct>,
                     std::bind(&LazySkipList<int>::add,
                     &lsl, std::placeholders::_1), 0, 1000000, 1000000));

我正在使用Xcode 4.4并支持llvm C ++ 11。

2 个答案:

答案 0 :(得分:7)

问题是std::vector::push_back()超载了两种可能的类型签名:

void push_back(const T& value);
void push_back(T&& value);

因此,无法推断出std::bind()的模板参数。但是,您可以显式声明模板参数:

std::bind<void(std::vector<int>::*)(const int&)>(&std::vector<int>::push_back, &v1, std::placeholders::_1);

这可以正确解析。

当然,在这一点上,使用lambda可能更简单:

auto func = [&](int i){ v1.push_back(i); };

答案 1 :(得分:1)

尝试:

auto funct = std::bind(static_cast<void(std::vector<int>::*)(const int&)>
                                             (&std::vector<int>::push_back),
                                              &v1,
                                              std::placeholders::_1);

push_back已超载,因此您需要将其转换为正确的重载。

或者:

void(std::vector<int>::*p)(const int&) = &std::vector<int>::push_back;
auto funct = std::bind(p, &v1, std::placeholders::_1);

或明确提供模板参数,如Keith Ballard的答案所示,其实际上可能是最好的。