如何调用模板函数更简洁

Van*_*lla 4 c++ templates

有一个功能

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必须保持不变.

hal*_*lat 8

我写了一个包装函数,将函数指针转换为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)