Есть класс (шаблонный), в котором один параметр — 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;
};
и это не работает.
Как правильно описать такую специализацию?
Здравствуйте 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>
{
};
Здравствуйте Кодт, Вы писали:
К>Здравствуйте bis0n, Вы писали:
B>>Есть класс (шаблонный), в котором один параметр — bool, второй — тип. Необходимо написать набор специализаций для разных типов, с сохранением шаблонности по bool. Пишу:
B>>и это не работает.
B>>Как правильно описать такую специализацию?
К>VC++ не поддерживает частичную специализацию...
К>Нужно реорганизовывать.
Единственный способ реорганизовать — написать набор классов, и перегрузить все функции их использующие для каждого класса отдельно, а это много работы и неэффективно, ведь со специализацией можно легко добавлять новые реализации, написать _только_ специализацию.... А так придется каждый раз менять набор использующих функций....
А VC7.0 поддерживает, или тоже руки оттуда же?
Здравствуйте 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>
Да, но расширяемость уже будет потеряна: все объявления специализаций должны лежать внутри заключающего класса, а с частичной специализацией — где угодно, только бы видеть их. Но, в принципе, это решение, спасибо.