C++通用函数调用者

Max*_*icu 10 c++ c++11

我想实现一个像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)

  • @MaxianNicu:是的.对于成员函数`Class :: method()`和一个对象`object`,用`caller(&Class :: method,&object)`调用它. (2认同)

Bar*_*rry 7

如果你想要做的就是使用任意参数调用任意函数,那么这只是两种类型的模板:

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::bindMike Seymour所建议的那样使用它.

  • 要工作"就像'thread`构造函数一样",如果`f`是一个成员函数指针,它也必须工作. (2认同)