1

У меня есть шаблон класса Z, что я хотел бы специализироваться при передаче типа, который представляет собой какие-либо конкретизации определенного шаблона N:шаблон специализации по параметру TYPENAME быть любым экземпляром конкретного шаблона

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. Есть ли способ достичь этого?

ответ

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 
+0

Спасибо, это именно то, что я искал. Я поиграл с подписью, но не смог вывести правильный. Я думаю, что на самом деле я получаю синтаксис параметров шаблонов в целом немного лучше. – Jeff

+0

Рад помочь. +1 на ваш вопрос от меня. – jxh