假设您有模板方法,该方法获取指向任何类型的方法的指针。在该模板中,是否有办法将模板参数(即方法指针类型(例如void(A::*)()
))转换为具有相同返回类型和参数的函数指针类型,但没有类信息({ {1}})?
我查看了void(*)()
标题,但找不到任何有用的内容。
答案 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() &&
等等。