¿Por qué esto funciona (Plantillas, SFINAE). C ++
Pregunta
refiriéndose a la entrada de ayer,
esto me despertó esta mañana. ¿Por qué esto realmente funciona? Mientras que respecta a la test
función, esta función no tiene cuerpo de modo cómo puede realizar cualquier cosa? Quiero saber por qué y cómo funciona esto? Estoy muy interesado en ver sus respuestas.
template<typename T>
class IsClassT {
private:
typedef char One;
typedef struct { char a[2]; } Two;
template<typename C> static One test(int C::*); //NO BODY HERE
template<typename C> static Two test(…); //NOR HERE
public:
enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == sizeof(One) };
enum { No = !Yes };
};
Gracias de antemano con la ayuda de entender este fenómeno muy interesante.
Solución
Asumo que usted se refiere a la enumeración Sí? IsClassT<T>::test<T>(0)
? sizeof en realidad no evalúa sus argumentos. Es por eso que un código como el siguiente es legal, a pesar de que se podría esperar que para rescatar a usted en:
int* p = 0;
int sizeof_int = sizeof(*p); //oops, p is 0 :(
Otros consejos
-
No se puede obtener error de compilación porque existe
test
-función declaración . -
No se puede obtener error de vinculador porque no llame
test
-función.
C ++ Standart ISO / IEC 14882: 2003 (E)
5.3.3 Sizeof
El operador sizeof produce el número de bytes en el representación de objeto de su operando. El operando es o bien una expresión, que no se evalúa , o una paréntesis tipo-id. La talla de operador no debe ...
...