2011-02-22 8 views
9

Quiero verificar si el tipo dado a una plantilla se hereda de una clase base en mi proyecto.Comprueba si el argumento de la plantilla se hereda de la clase

que debería funcionar como cabría esperar desde el siguiente ejemplo:

template< class T : public CBaseClass > 
  • ¿Es posible hacer esto con las plantillas, si no es así, de qué otra manera puedo hacerlo?
+0

Comprobar http://stackoverflow.com/questions/4532281/how-to-test-whether-class-b-is-derived-from- class-a –

Respuesta

10

Puede utilizar boost::is_base_and_derived de Boost, combinado con BOOST_STATIC_ASSERT. Si está utilizando un compilador con soporte TR1 o C++ 0x, existen equivalentes de esos constructos en la biblioteca estándar (std::is_base_of, y la declaración static_assert en C++ 0x).

+0

No tengo permiso para usar boost, desafortunadamente – Oktstrom

+1

@Oktstrom: ¿Qué compilador estás usando? ¿Es compatible con TR1 o C++ 0x? –

+0

Estoy usando el compilador que viene con Visual Studio 2010 – Oktstrom

11

Following un example from Stroustrup:

template<class Test, class Base> 
struct AssertSameOrDerivedFrom { 
    AssertSameOrDerivedFrom() { &constraints; } 
public: 
    static void constraints() { 
    Test *pd = 0; 
    Base *pb = pd; 
    } 
}; 

template<class T> 
struct YourClass { 
    YourClass() { 
    AssertSameOrDerivedFrom<T, CBaseClass>(); 
    } 
}; 

En C++ 0x, esto se convierte en:

template<class T> 
struct YourClass { 
    static_assert(std::is_base_of<CBaseClass, T>::value); 
}; 
+0

Excelente como una afirmación, pero no funciona tan bien como una prueba. –

+0

@CrazyEddie: dado el ejemplo del código en la pregunta, creo que el OP significa "afirmar" por "control" en lugar de "hacer X si C, sino Y". –

6

Si quiere hacer valer, hacerlo a la manera de Nurk. Si desea verificar, use is_base_of de boost o C++ 0x. Si no puede utilizar cualquiera de ellos, utilizar SFINAE:

template < typename Base, typename PotentialDerived > 
struct is_base 
{ 
    typedef char (&no) [1]; 
    typedef char (&yes) [2]; 

    static yes check(Base*); 
    static no check(...); 

    enum { value = sizeof(check(static_cast<PotentialDerived*>(0))) == sizeof(yes) }; 
}; 
Cuestiones relacionadas