0

我正在尝试将这里解释的函数技术扩展到方法。问题是方法签名模板参数。例如,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>

那么正确的语法是什么?

4

1 回答 1

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 和右值限定的所有可能组合,这将变得有点冗长。

于 2013-01-13T12:24:39.417 回答