模板类的模板函数指针 - C++

tow*_*ism 0 c++ templates typedef member-function-pointers

template<typename C, typename Arg>
int foo(C* c, int (C::*func)(Arg), Arg a)
{
  c->*func(a);
}
Run Code Online (Sandbox Code Playgroud)

要调用'foo',我们必须同时使用A*和&A :: bar,

foo(A*,&A::bar,var);
Run Code Online (Sandbox Code Playgroud)

有没有办法定义模板(例如作为结构),这样就不需要传递"A*"了?如何定义从"&A :: bar"获取A*的模板?

Use*_*ess 5

如果要在该实例上调用非静态方法,则无法避免传递实例,除非您不介意在临时的,默认构造的实例上调用它:

template<typename C, typename Arg>
int call_on_temp(int (C::*func)(Arg), Arg a)
{
    C temp;
    temp.*func(a);
}
Run Code Online (Sandbox Code Playgroud)

或者调用者将实例显式绑定到仿函数:

template<typename F, typename Arg>
int call_on_functor(F func, Arg a)
{
    func(a);
}
Run Code Online (Sandbox Code Playgroud)

这使得呼叫网站变得丑陋:

call_on_functor(std::bind(std::mem_fn(&Class::method), instance), arg);
Run Code Online (Sandbox Code Playgroud)

(你仍然需要实例,你只是将它从一个地方移动到另一个地方).

请注意,您可以从函数指针推断出A 的类型,您无法推断出一个实例来调用您的函数.如果要调用静态方法,则根本不需要类类型:

template<typename Arg>
int call_on_static(int (*func)(Arg), Arg a)
{
    func(a);
}
Run Code Online (Sandbox Code Playgroud)