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

时间:2014-03-11 12:40:10

标签: c++ templates typedef member-function-pointers

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

要打电话给&#39; foo&#39;,我们必须同时播放A *和&amp; A :: bar,

foo(A*,&A::bar,var);

有没有办法定义模板(例如结构),这样就不需要传递&#34; A *&#34;?如何定义一个从&#34;&amp; A :: bar&#34;中获取A *的模板?

2 个答案:

答案 0 :(得分:5)

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

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

或调用者明确地将实例绑定到仿函数中:

template<typename F, typename Arg>
int call_on_functor(F func, Arg a)
{
    func(a);
}

使调用网站变得丑陋:

call_on_functor(std::bind(std::mem_fn(&Class::method), instance), arg);

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

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

template<typename Arg>
int call_on_static(int (*func)(Arg), Arg a)
{
    func(a);
}

答案 1 :(得分:1)

应该做你需要的:

template<typename unused>
struct member_function_pointer_type_helper;

template<typename R, typename C>
struct member_function_pointer_type_helper<R C::*> {
    typedef C type;
};

template<typename F>
struct member_function_pointer_type : member_function_pointer_type_helper<typename std::remove_cv<F>::type> {
};

示例:

struct A { void foo() { ... } };


typedef member_function_pointer_type<decltype(&A::foo)>::type a_type; // 'A'

a_type my_a;
my_a.foo(); 

这是通过为成员函数提供专用模板,然后只导出该成员函数的类部分。