2011-02-13 9 views
11

¿Hay alguna posibilidad de forzar una plantilla para que sea de una cierta clase base, entonces puedo llamar a la función de clase base?force template <class> derivado de BaseClassA?

template <class T> 
void SomeManager::Add(T) 
{ 
    T->CallTsBaseClassFunction(); 
    //... do other stuff 
} 
+0

duplicado Posible de restricciones [Plantilla C++] (http://stackoverflow.com/questions/122316/ plantilla-restricciones-c). –

+1

¿Por qué no llamas a la función y ves si funciona? –

+0

@Bo Persson: porque eso solo garantiza una herencia nominal, no estructural. Puede que termines llamando 'Random :: CallTsBaseClassFunction' si' class Random' simplemente implementa una función con el mismo nombre. – MSalters

Respuesta

20

Claro, se puede combinar con características de tipo SFINAE:

#include <type_traits> 

template <class T> 
typename std::enable_if<std::is_base_of<your_base_class, T>::value, void>::type 
SomeManager::Add(T) 
{ 
    T->CallTsBaseClassFunction(); 
    //... do other stuff 
} 

Aunque realmente no veo la ventaja aquí.

+0

gracias eso es lo que estaba buscando – cppanda

5

La solución más sencilla es añadir un fragmento de código que compila sólo si es lo que se esperaba:

template <class T> 
void SomeManager::Add(T t) 
{ 
    assert((Base const*)&t); // T must inherit from Base to allow T*->Base* conversion. 
    t.CallTsBaseClassFunction(); 
    //... do other stuff 
}