我有一个类模板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>>
都是有效的用例,我无法做任何事情,就像将Z
转换为模板模板一样当Z<TX, TY>::bar(TX &)
是从TY
构建的类时,N
可能会降低引人注目的复杂性。有没有办法实现这个目标?
答案 0 :(得分:1)
这应该影响你想要的专业化:
template <typename TX, typename ANY>
struct Z< TX, N<ANY> > {
// ...
};
当第一个参数为Z
时, TX
会被专门化,第二个参数为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