我想实现一个像thread构造函数一样工作的函数调用者.例如
std::thread second (bar,0);
Run Code Online (Sandbox Code Playgroud)
将启动一个bar使用单个参数调用的线程0.我想做同样的事情,但我不知道怎么做.
例如,给定:
void myFunc(int a){
cout << a << endl;
}
Run Code Online (Sandbox Code Playgroud)
我想要:
int main() {
caller(myFunc,12);
}
Run Code Online (Sandbox Code Playgroud)
myFunc用参数调用12.
Mik*_*our 21
std::bind将使用任意一组参数从任何可调用对象创建一个可调用对象,就像thread构造函数一样.所以只需将它包装在一个调用它的函数中:
template <typename... Args>
auto caller(Args &&... args) {
return std::bind(std::forward<Args>(args)...)();
}
Run Code Online (Sandbox Code Playgroud)
请注意,auto返回类型需要C++ 14或更高版本.对于C++ 11,您必须返回void或指定类型:
auto caller(Args &&... args)
-> decltype(std::bind(std::forward<Args>(args)...)())
Run Code Online (Sandbox Code Playgroud)
如果你想要做的就是使用任意参数调用任意函数,那么这只是两种类型的模板:
template <typename Function, typename Arg>
void call_with_one(Function&& f, Arg&& arg) {
f(std::forward<Arg>(arg));
}
Run Code Online (Sandbox Code Playgroud)
您可以通过使其变量来扩展以调用任意数量的args:
template <typename Function, typename... Arg>
void call_with_any(Function f, Arg&&... args) {
f(std::forward<Arg>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
或者真的f应该是转发参考:
template <typename Function, typename... Arg>
void call_with_any(Function&& f, Arg&&... args) {
std::forward<Function>(f)(std::forward<Arg>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
请注意,这仅适用于实现的函数和对象operator().如果f是指向成员的指针,这将失败 - 你将不得不std::bind像Mike Seymour所建议的那样使用它.