tengo la siguiente clase de plantilla y una variable (global) de su tipo:Detectar si un tipo se puede derivar de en C++
template <typename ClassT>
struct ClassTester : public ClassT {
typedef ClassT type;
};
ClassTester<int> *aaa; // No error here
me esperaba un error de compilación porque int
no se puede derivar de, pero este compila bien en Visual C++ 2010.
Si quito el puntero, me sale el error esperado compilación (int no se puede derivar de):
ClassTester<int> bbb; // Error here
I w anted a utilizar esta clase para las pruebas SFINAE si el tipo dado es una clase que se puede derivar de:
template <typename T>
struct CanBeDerivedFrom {
template <typename C>
static int test(ClassTester<T> *) { }
template <typename>
static char test(...) { }
static const bool value = (sizeof(test<T>(0)) == sizeof(int));
};
Esto, sin embargo, siempre informa cierto, incluso para tipos primitivos como int
debido a la razón anterior. ¿Es este un comportamiento esperado/válido de C++?
Sospecho que la razón es que simplemente declarando/definiendo un puntero no requiere realmente instanciar la plantilla. Después de todo, no usas 'ClassTester *' para nada. –
visitor
Un ejemplo similar sería comprobar si un parámetro de plantilla es POD o no POD. –
Iba a sugerir como visitante. No creo que declarar un puntero instanciará la plantilla, por lo que puede compilarse. Intente acceder a un miembro utilizando la plantilla mediante el puntero, lo que obligaría al compilador a crear una instancia de la plantilla. De lo contrario, no estoy muy seguro, pero sé que no puedes heredar un tipo entero. – Jeremy