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 に答える