如何将方法指针类型转换为函数指针类型

时间:2012-12-09 00:21:45

标签: c++ templates

假设您有模板方法,该方法获取指向任何类型的方法的指针。在该模板中,是否有办法将模板参数(即方法指针类型(例如void(A::*)()))转换为具有相同返回类型和参数的函数指针类型,但没有类信息({ {1}})?

我查看了void(*)()标题,但找不到任何有用的内容。

1 个答案:

答案 0 :(得分:4)

C ++ 11中的一个简单方法是使用可变参数模板进行部分特化:

template<class PMF> struct pmf_to_pf;

template<class R, class C, class... Args>
struct pmf_to_pf<R (C::*)(Args...)>{
  using type = R(*)(Args...); // I like using aliases
};

请注意,您需要对const成员函数进行单独的部分特化(理论上还需要ref-qualified成员函数):

template<class R, class C, class... Args>
struct pmf_to_pf<R (C::*)(Args...) const>{
  using type = R(*)(Args...);
};

使用cv限定符({nil,const}{nil,volatile})和参考限定符({nil, &, &&}),您总共有2*2*3 == 12部分专业化提供。你通常可以省略volatile限定条件,将总数降低到“只”6.由于大多数编译器不支持函数引用限定符,你只需要2,但要注意其余的。


对于C ++ 03(也就是没有可变参数模板的编译器),您可以使用以下非可变形式:

template<class PMF> struct pmf_to_pf;

template<class Sig, class C>
struct pmf_to_pf<Sig C::*>{
  typedef Sig* type; // 'Sig' is 'R(Args...)' and 'Sig*' is 'R(*)(Args...)'
};

虽然这对cv-qualifiers不太适用,但我认为C ++ 03不允许使用cv限定签名(例如R(Args...) const),你可以部分专门删除{{1 }}


const表示一组特定限定符,{...}表示空集。例子:

  • nil将为void f() const&
  • {const}, {nil}, {&}将为void f() &&

等等。