Специализация шаблона.
От: bis0n Украина  
Дата: 09.04.02 13:57
Оценка:
Есть класс (шаблонный), в котором один параметр — bool, второй — тип. Необходимо написать набор специализаций для разных типов, с сохранением шаблонности по bool. Пишу:

template<bool _B,class _C>
class ClassT
{
//this class doesn't work and even compile ;)
};

template<bool _B>
class ClassT<_B,int>
{
//реализация для int;
};

template<bool _B>
class ClassT<_B,float>
{
//реализация для float;
};

template<bool _B>
class ClassT<_B,double>
{
//реализация для double;
};

и это не работает.
Как правильно описать такую специализацию?
// End of transfer
Re: Специализация шаблона.
От: Кодт Россия  
Дата: 09.04.02 14:03
Оценка:
Здравствуйте bis0n, Вы писали:

B>Есть класс (шаблонный), в котором один параметр — bool, второй — тип. Необходимо написать набор специализаций для разных типов, с сохранением шаблонности по bool. Пишу:



B>и это не работает.

B>Как правильно описать такую специализацию?

VC++ не поддерживает частичную специализацию...
Нужно реорганизовывать.
Перекуём баги на фичи!
Re: Специализация шаблона.
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 09.04.02 14:05
Оценка:
Здравствуйте bis0n, Вы писали:

VC не поддерживает часитную специализацию.
Но это можно обойти, используя следующий код:

template<bool bT>
class A
{
public:
  template<class T>
  class B
  {
  };
  class B<int>
  {
  };
  class B<double>
  {
  };
};

template<bool bT, class T>
class ClassT:
 public A<bt>::B<T>
{
};
Re[2]: Специализация шаблона.
От: bis0n Украина  
Дата: 09.04.02 14:11
Оценка:
Здравствуйте Кодт, Вы писали:

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


B>>Есть класс (шаблонный), в котором один параметр — bool, второй — тип. Необходимо написать набор специализаций для разных типов, с сохранением шаблонности по bool. Пишу:



B>>и это не работает.

B>>Как правильно описать такую специализацию?

К>VC++ не поддерживает частичную специализацию...

К>Нужно реорганизовывать.

Единственный способ реорганизовать — написать набор классов, и перегрузить все функции их использующие для каждого класса отдельно, а это много работы и неэффективно, ведь со специализацией можно легко добавлять новые реализации, написать _только_ специализацию.... А так придется каждый раз менять набор использующих функций....

А VC7.0 поддерживает, или тоже руки оттуда же?
// End of transfer
Re[2]: Специализация шаблона.
От: bis0n Украина  
Дата: 09.04.02 14:24
Оценка:
Здравствуйте DarkGray, Вы писали:

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


DG>VC не поддерживает часитную специализацию.

DG>Но это можно обойти, используя следующий код:

DG>
DG>template<bool bT>
DG>class A
DG>{
DG>public:
DG>  template<class T>
DG>  class B
DG>  {
DG>  };
DG>  class B<int>
DG>  {
DG>  };
DG>  class B<double>
DG>  {
DG>  };
DG>};

DG>template<bool bT, class T>
DG>class ClassT:
DG> public A<bt>::B<T>
DG>{
DG>};

DG>


Да, но расширяемость уже будет потеряна: все объявления специализаций должны лежать внутри заключающего класса, а с частичной специализацией — где угодно, только бы видеть их. Но, в принципе, это решение, спасибо.
// End of transfer
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.