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。
答案 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的答案所示,其实际上可能是最好的。