3
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));

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

4

2 回答 2

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); };
于 2012-09-10T01:52:27.933 回答
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 的答案所示,这实际上可能是最好的。

于 2012-09-10T01:52:18.130 回答