Как избежать повторения всего шаблона класса, когда требуется только одна специализация члена

Предположим, у вас есть:

template<class T>
class A {
template<class T1>
void foo(const T1& t1) {}

//
// Lots of other definitions (all templated)
//
};

и вы хотели бы специализироваться foo(const T1&) но только для специализированного A<bool>, Как это:

template<>
class A<bool> {
template<class T1>
void foo(const T1& t1) {
// Code for specialized A<boo>::foo
}

//
// Repeating the former definitions, how to avoid this ??
//
};

Но чтобы это заработало, мне нужно продублировать весь код, определенный в шаблоне класса. class A и включите его снова в class A<bool>,

Я пытался определить только специализацию члена:

template<>
void A<bool>::template<class T1> foo(const T1&) {}

Также это не работает:

template <class T1> void A<bool>::foo(const T1&) {}

Но компилятору это не нравится.
Как бороться с этим дублированием кода?

6

Решение

Синтаксис? Увидеть этот ответ. Пытаться:

template<>
template<typename T1>
void A<bool>::foo(const T1&){}

Вам, конечно, не нужно копировать весь шаблон класса.

7

Другие решения

Вы можете предоставить функцию и шаблон класса, а затем определить пару typedefs:

template<class T, class TArg>
class A
{
void foo(const TArg& arg) {}

// Lots of other definitions (all templated)
};

typedef A<MyType, MyType> NormalClass;
typedef A<MyType, bool>   BoolClass;
0

По вопросам рекламы [email protected]