方法作为可变参数模板参数

时间:2013-01-13 12:19:02

标签: c++ templates c++11 function-pointers variadic-templates

我正在尝试扩展到为函数解释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>

那么正确的语法是什么?

1 个答案:

答案 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资格的所有可能组合,这将会有点冗长。