Это легко решить, если вы не против более общей ситуации:
Я бы просто добавил параметр шаблона в вашу DoSomething
функцию:
template<class T>
void DoSomething(const TemplateClass<T *> &tc)
{
}
Конечно, это не позволяет вам напрямую ограничить параметр T
в качестве подкласса Base
. Но это позволит вам не записывать несколько перегрузок DoSomething
.
Редактировать
Если ваш TemplateClass
был предназначен для переноса значения типа T
, то может быть способ ограничиться параметром для DoSomething
.
Предположим, TemplateClass
было объявлено что-то вроде
template<class T>
class TemplateClass
{
public:
TemplateClass( T value )
: Value(value)
{
}
T Value;
};
Тогда DoSomething
можно записать как
template<class T>
void DoSomething( const TemplateClass<T *> &tc )
{
Base * b = tc.Value;
}
Теперь во время компиляции строка Base * b = tc.Value
будет компилироваться, только если для T
установлен подкласс Base
. В противном случае произойдет сбой из-за недопустимого преобразования.
Конечно, это очень простой пример, который может игнорировать некоторые элементы хорошего дизайна. Но принцип там, и это единственный способ, которым я в настоящее время знаю о создании такого ограничения для параметра шаблона.