有一个功能
template <class ...T>
void foo(std::function<void(T...)> callback);
我向其中传递了一个回调。
我想做类似的事情
foo(bar);
where bar
例如,
void bar(int a, long b, double c, float d);
但这给了我
error: no matching function for call to bar(void (&)(int, long int, double, float))
我得打电话foo
as
foo(std::function<void(int, long, double, float)>(bar));
这太冗长了。甚至
foo<int, long, double, float>(bar);
会更好。
foo(bar);
就很理想了。
无论如何,我怎样才能打电话给foo
变得不那么冗长?
Edit:声明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));
}
foo()
然后可以以任何一种方式调用:
void bar(int,double) {}
void foo_caller() {
foo(std::function<void (int,double)>(bar));
foo(bar);
}
附录:非静态成员函数包装器
相同的方法可用于指向成员函数的指针 - 只需添加另一个重载:
template <typename C,typename... T>
void foo(void (C::*f)(T...)) {
foo(std::function<void (C *,T...)>(f));
}
请注意额外的第一个参数this
成员函数的指针。用法类似:
struct quux {
void mf(char *,double) {}
};
void foo_caller() {
foo(&quux::mf);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)