template tepmplate parameters
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 22.08.08 10:02
Оценка:
Недавно узнал про сабж. Много думал
Непонятен остался один момент.

Допустим есть шаблон:
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> а;
Это совсем другое...

Вопрос представляет чисто академический интерес.
Спасибо.
Re: template tepmplate parameters
От: Аноним  
Дата: 22.08.08 10:47
Оценка:
Здравствуйте, 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;
}
Re: template tepmplate parameters
От: VoidEx  
Дата: 22.08.08 10:58
Оценка: 2 (1) +1
Здравствуйте, 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 можно опустить, и ничего не изменится.
Re: template tepmplate parameters
От: Were  
Дата: 22.08.08 10:58
Оценка:
Здравствуйте, 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 явно не указывается.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.