有一个功能
template <class ...T>
void foo(std::function<void(T...)> callback);
Run Code Online (Sandbox Code Playgroud)
我通过回调.
我想做点什么
foo(bar);
Run Code Online (Sandbox Code Playgroud)
bar例如,在哪里
void bar(int a, long b, double c, float d);
Run Code Online (Sandbox Code Playgroud)
但这给了我
error: no matching function for call to bar(void (&)(int, long int, double, float))
Run Code Online (Sandbox Code Playgroud)
我要打电话foo的
foo(std::function<void(int, long, double, float)>(bar));
Run Code Online (Sandbox Code Playgroud)
这太冗长了.甚至
foo<int, long, double, float>(bar);
Run Code Online (Sandbox Code Playgroud)
本来会更好.
foo(bar);
Run Code Online (Sandbox Code Playgroud)
会是理想的.
无论如何,我怎么能打电话来foo减少冗长?
编辑:声明foo必须保持不变.
我写了一个包装函数,将函数指针转换为std::function包装器:
template <typename... T>
void foo(std::function<void (T...)> f) {}
template <typename... T>
void foo(void (*f)(T...)) {
foo(std::function<void (T...)>(f));
}
Run Code Online (Sandbox Code Playgroud)
foo() 然后可以被调用:
void bar(int,double) {}
void foo_caller() {
foo(std::function<void (int,double)>(bar));
foo(bar);
}
Run Code Online (Sandbox Code Playgroud)
附录:非静态成员函数包装器
相同的方法可用于指向成员的函数 - 只需添加另一个重载:
template <typename C,typename... T>
void foo(void (C::*f)(T...)) {
foo(std::function<void (C *,T...)>(f));
}
Run Code Online (Sandbox Code Playgroud)
注意this成员函数指针的额外第一个参数.用法类似:
struct quux {
void mf(char *,double) {}
};
void foo_caller() {
foo(&quux::mf);
}
Run Code Online (Sandbox Code Playgroud)