Недавно узнал про сабж. Много думал
Непонятен остался один момент.
Допустим есть шаблон:
template <template <typename U> class T> class B
{
//...
};
Как в в шаблоне можно использовать U?
MSVC++ 8 ругается при упоминании U.
В доступной документации внятного разъяснения не нашел.
В примерах в основном используется что-то вроде:
template <template <typename> class T, class V> class A
{
T<V> а;
};
Или даже T<int> а;
Это совсем другое...
Вопрос представляет чисто академический интерес.
Спасибо.
Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>Как в в шаблоне можно использовать U?
Напрямую никак, его даже не обязательно писать:
template <template <typename> class T> class B
{
//...
};
ROP>MSVC++ 8 ругается при упоминании U.
Его можно использовать косвенно, через тип T, когда внутри T есть typedef на шаблонный аргумент:
template<typename T> struct Test {
typedef typename T type;
};
template<template<typename> class T,typename V> struct Test2
{
void foo()
{
T<V>::type a;
}
};
int main()
{
Test2<Test,int> b;
b.foo();
return 0;
}
Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>Как в в шаблоне можно использовать U?
Дело в том, что U — это параметр шаблона T
Думай об этом, как о параметре функции. Ты же не можешь имя параметра использовать снаружи функции, только внутри. Так же и тут, ты сам передаешь некий аргумент в T:
template <template <typename U> class T> // T :: typename -> class
struct X
{
T<int> x; // U == int
T<T<float> > y; // U == T<float>
};
Поэтому одного конкретного U у тебя нет, ты можешь передавать туда (в шаблон T) любой тип и в результате получаешь тоже тип.
Сравни:
int X(int (*T)(int U))
{
(*T)(5); // U == 5
(*T)((*T)(6)); // U == (*T)(6)
return 0;
}
Использовать же просто U не имеет смысла (и невозможно)
Собственно, в обоих примерах U можно опустить, и ничего не изменится.
Здравствуйте, R.O. Prokopiev, Вы писали:
ROP>Недавно узнал про сабж. Много думал
ROP>Непонятен остался один момент.
ROP>Допустим есть шаблон:
ROP>ROP>template <template <typename U> class T> class B
ROP>{
ROP>//...
ROP>};
ROP>
ROP>Как в в шаблоне можно использовать U?
В данном случае U представляет собой тип, которым может параметризоваться T, а не которым он был параметризован при инстанцировании B. Ведь инстанцировать B ты будешь примерно таким образом
template < typename U > class A {};
B<A> b;
тут U явно не указывается.