std :: bind无法按预期工作

Vis*_*mar 3 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));
Run Code Online (Sandbox Code Playgroud)

这给了我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));
Run Code Online (Sandbox Code Playgroud)

我正在使用Xcode 4.4和llvm C++ 11支持.

Lil*_*ard 7

问题是std::vector::push_back()两个可能的类型签名重载:

void push_back(const T& value);
void push_back(T&& value);
Run Code Online (Sandbox Code Playgroud)

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

std::bind<void(std::vector<int>::*)(const int&)>(&std::vector<int>::push_back, &v1, std::placeholders::_1);
Run Code Online (Sandbox Code Playgroud)

这解决得很正确.

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

auto func = [&](int i){ v1.push_back(i); };
Run Code Online (Sandbox Code Playgroud)

  • lambda建议的+1,在这种情况下更好. (3认同)