Шаблоны шаблонов
От: Chez Россия  
Дата: 22.03.05 14:27
Оценка:
Как известно, такая конструкция нормально компилится в VC7:

template<template<typename P> class T>
class A
{
};
А можно ли добиться, чтобы шаблон A параметризовалося шаблонным классом, параметризуемым указателем?
Т.е. что-то вроде
template<template<typename P> template<P*> class T> // это не компилится
class A
{
};

Чтобы можно было в A передавать шаблон типа
template<int* P>
class T
{
};
typedef A<T> _AT;

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:Tenhi — Huomen — Morrow

Re: Шаблоны шаблонов
От: Lorenzo_LAMAS  
Дата: 22.03.05 14:36
Оценка:
Чего то ты всего намесил в кучу. Если у тебя класс template<int *> class A; то он никак не может быть аргументом для
< template<class>class PARAM > Почему бы тебе явно не написать template<class T, template<T *>class T1> clas lalala{}; ??
Of course, the code must be complete enough to compile and link.
Re: Шаблоны шаблонов
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 22.03.05 14:40
Оценка:
Здравствуйте, Chez, Вы писали:

C>
C>template<template <typename P> template<P*> class T> // Это чего такое :)
C>class A
C>{
C>};
C>


Обычный вид Template Template Parameters такой
template <template <class W> typename T>
class A
{
};


Причем если W не участвует в описании/определении класса A, то этот символ (в терминах компилятора/линкера) можно опустить — это просто формальный параметр.
А так — частичная специализация в помошь.
HgLab: Mercurial Server and Repository Management for Windows
Re[2]: Шаблоны шаблонов
От: Chez Россия  
Дата: 22.03.05 14:50
Оценка:
L_L>Почему бы тебе явно не написать template<class T, template<T *>class T1> clas lalala{}; ??
не пойдёт.

В общем, задача такая:
есть куча классов объявленных так:
template<int*>
class A1{};
template<double*>
class A2{}; // и т.д.

Нужно написать шаблонный класс-дискриминатор который определял бы тип указателя в шаблоне соотв. A-класса. Т.е.
typedef DesiredClass<A1>::Type A1_pT; // == int*
typedef DesiredClass<A2>::Type A2_pT; // == double*


Так можно сделать?

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:Tenhi — Vastkaiun

Re[3]: Шаблоны шаблонов
От: korzhik Россия  
Дата: 22.03.05 14:55
Оценка: :)
Здравствуйте, Chez, Вы писали:

C>В общем, задача такая:

C>есть куча классов объявленных так:
C>
C>template<int*>
C>class A1{};
C>template<double*>
C>class A2{}; // и т.д.
C>

C>Нужно написать шаблонный класс-дискриминатор который определял бы тип указателя в шаблоне соотв. A-класса. Т.е.
C>
C>typedef DesiredClass<A1>::Type A1_pT; // == int*
C>typedef DesiredClass<A2>::Type A2_pT; // == double*
C>


C>Так можно сделать?


Вот такое решение на грани возможностей современных компиляторов C++ подойдёт?
template<int*>
struct A1
{
  typedef int type;  
};

template<double*>
struct A2
{
  typedef double type;  
};

template<class T>
struct MetaProgrammingForeverClass
{
  typedef typename T::type type;
};
Re[4]: Шаблоны шаблонов
От: Chez Россия  
Дата: 22.03.05 15:04
Оценка:
Здравствуйте, korzhik, Вы писали:

K>Вот такое решение на грани возможностей современных компиляторов C++ подойдёт?

Рано смеётесь. Не подойдёт.
Классы A1, A2... не могут иметь реализации, только объявление.

Вот такое требование.

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:Tenhi — Vilja

Re[4]: Шаблоны шаблонов
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 22.03.05 15:06
Оценка:
Здравствуйте, korzhik, Вы писали:

K>
K>template<int*>
K>struct A1
K>{
K>  typedef int type;  
K>};

K>template<double*>
K>struct A2
K>{
K>  typedef double type;  
K>};

K>template<class T>
K>struct MetaProgrammingForeverClass
K>{
K>  typedef typename T::type type;
K>};
K>


Только вот наверное проблематично будет потом избавиться от этой звездочки — то бишь где-нибудь да понадобится stripped type

template <typename T>
struct TypeStripper
{
    typedef typename T type;
};

template <typename T>
struct TypeStripper<T*>
{
    typedef typename T type;
};

//
// И в итоге получаем:
template <typename T>
struct MetaProgrammingForeverClass
{
    typedef T::type type;
    typedef TypeStripper<T::type>::type stripped_type;
};
HgLab: Mercurial Server and Repository Management for Windows
Ответ на сообщение, которое вы удалили :)
От: Chez Россия  
Дата: 22.03.05 15:25
Оценка: :)
L_L> <skipped>
вместо того чтоб подшучивать лучше помогли чем... я TYPE_OF() изобретаю до сих пор... вот поэтому у меня и вопросы корявые.

Кстати, на 50% уже сделал, но почему то никто не обратил внимания, здесь
Автор: Chez
Дата: 10.02.05
.

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:Tenhi — Tenhi

Re: Ответ на сообщение, которое вы удалили :)
От: korzhik Россия  
Дата: 22.03.05 20:04
Оценка:
Здравствуйте, Chez, Вы писали:

L_L>> <skipped>

C>вместо того чтоб подшучивать лучше помогли чем...
не хотел обидеть

>я TYPE_OF() изобретаю до сих пор... вот поэтому у меня и вопросы корявые.

желаю удачи

C>Кстати, на 50% уже сделал, но почему то никто не обратил внимания, здесь
Автор: Chez
Дата: 10.02.05
.

typeof должен быть на уровне core language, иначе это представляет только теоретический интерес IMхO (я имею ввиду навароты с шаблонами)
Re: Ответ на сообщение, которое вы удалили :)
От: Lorenzo_LAMAS  
Дата: 23.03.05 09:01
Оценка:
L_L>> <skipped>
C>вместо того чтоб подшучивать лучше помогли чем... я TYPE_OF() изобретаю до сих пор... вот поэтому у меня и вопросы корявые.

Я его потому и удалил, что счел неуместным. Так как оно удалено уже, извиняться за него не стану А вообще вместо изобретения TYPE_OF займись написанием своего компилятора Или модификацией существующего — например GCC, исходники которого доступны и в котором, к тому же, есть typeof.
Of course, the code must be complete enough to compile and link.
Re[2]: Ответ на сообщение, которое вы удалили :)
От: Chez Россия  
Дата: 23.03.05 10:05
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>>> <skipped>

C>>вместо того чтоб подшучивать лучше помогли чем... я TYPE_OF() изобретаю до сих пор... вот поэтому у меня и вопросы корявые.

L_L>Я его потому и удалил, что счел неуместным. Так как оно удалено уже, извиняться за него не стану А вообще вместо изобретения TYPE_OF займись написанием своего компилятора Или модификацией существующего — например GCC, исходники которого доступны и в котором, к тому же, есть typeof.

Пожалуй для меня это слишком сложная задача
Я надеюсь что выйдет новый стандарт C++, который включит в себя множество полезных фич.

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:Tenhi — Souto — Drift

Re[2]: Ответ на сообщение, которое вы удалили :)
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 23.03.05 11:03
Оценка:
Здравствуйте, korzhik, Вы писали:

C>>Кстати, на 50% уже сделал, но почему то никто не обратил внимания, здесь
Автор: Chez
Дата: 10.02.05
.

K>typeof должен быть на уровне core language, иначе это представляет только теоретический интерес IMхO (я имею ввиду навароты с шаблонами)

Но некоторым, всем нам известным, людям не терпится уже сейчас преимущества тайпофа использовать
http://lists.boost.org/MailArchives/boost/msg64150.php
Re[3]: Ответ на сообщение, которое вы удалили :)
От: korzhik Россия  
Дата: 23.03.05 11:37
Оценка:
Здравствуйте, alnsn, Вы писали:

A>Здравствуйте, korzhik, Вы писали:


C>>>Кстати, на 50% уже сделал, но почему то никто не обратил внимания, здесь
Автор: Chez
Дата: 10.02.05
.

K>>typeof должен быть на уровне core language, иначе это представляет только теоретический интерес IMхO (я имею ввиду навароты с шаблонами)

A>Но некоторым, всем нам известным, людям не терпится уже сейчас преимущества тайпофа использовать

A>http://lists.boost.org/MailArchives/boost/msg64150.php

понятно.
Одно не понимаю что мешало добавить typeof в стандарт в 98 году
Делов то: взять реализацию sizeof и немножко изменить.
Минусов от внедрения typeof не вижу, однако не приняли почему то
Re[4]: Ответ на сообщение, которое вы удалили :)
От: Lorenzo_LAMAS  
Дата: 23.03.05 11:58
Оценка: +1
K>понятно.
K>Одно не понимаю что мешало добавить typeof в стандарт в 98 году
K>Делов то: взять реализацию sizeof и немножко изменить.
K>Минусов от внедрения typeof не вижу, однако не приняли почему то

(ИМХО)
Да, но наверняка тогда и плюсы от его добавления не были так уж очевидны.
Of course, the code must be complete enough to compile and link.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.