我正在尝试扩展到为函数解释here的技术的方法。问题是方法签名模板参数。例如,sin函数的包装器以这种方式创建:
template<typename Sig, Sig& S> struct wrapper;
template<typename Ret, typename... Args, Ret(&P)(Args...)>
struct wrapper<Ret(Args...), P> {
// blah
}
然后用
实例化wrapper<decltype(sin), sin>
但对于方法bool Foo::blah(int)
,此技术被拒绝:
template<class C, typename Sig, Sig& S> struct wrapper;
template<class C, typename Ret, typename... Args, Ret(C::*P)(Args...)>
struct wrapper<Ret(C::)(Args...), P> {
// blah
}
wrapper<decltype(Foo::blah), &Foo::blah>
那么正确的语法是什么?
答案 0 :(得分:2)
成员函数没有自由函数类型的类比。您需要直接使用指向成员函数的指针。
尝试这样的事情:
template <typename C, typename MFP, MFP> struct wrapper;
template <typename C, typename R, typename ...Args, R (C::*MFP)(Args...)>
struct wrapper<C, R (C::*)(Args...), MFP>
{
// ...
};
请注意,如果您想接受CV和rvalue资格的所有可能组合,这将会有点冗长。