1

Z特定のテンプレートの任意のインスタンス化である型を渡したときに特化したいクラス テンプレートがありNます。

struct L {
    template <typename S> void foo(S &) {/*...*/}
};

template <class T>
struct M {
    template <typename S> void foo(S &) {/*...*/}
};

template <class T>
struct N {
    template <typename S> void foo(S &) {/*...*/}
};

// I'd like to specialize this for TY==N<anything>
template <typename TX, typename TY>
struct Z {
    void bar(TX &tx) { /*...*/ ty->foo(tx); /*...*/ }
    TY *ty;
};

Z<int, L>Z<int, N<int>>とはすべて有効なユース ケースであるため、テンプレート テンプレートに変換する方法Z<int, M<int>>に沿って何もすることはできません。これを達成する方法はありますか?ZZ<TX, TY>::bar(TX &)TYN

4

1 に答える 1

1

これは、あなたが望む専門化に影響を与えるはずです:

template <typename TX, typename ANY>
struct Z< TX, N<ANY> > {
    // ...
};

ZTXは、最初のパラメーターがで、2 番目のパラメーターが の場合に特殊化されますN<ANY>。簡単な例:

template <typename A> struct N { A a; };

template <typename TX, typename TY>
struct Z { Z () { std::cout << "not special" << std::endl; } };

template <typename TX, typename ANY>
struct Z< TX, N<ANY> > { Z () { std::cout << "special" << std::endl; } };

int main ()
{
    Z<int, int> z1;
    Z<int, N<int> > z2;
}

出力結果は次のとおりです。

not special
special
于 2012-06-13T05:11:23.637 に答える