Estoy tratando de obtener un ejemplo simple para entender cómo usarlo std::enable_if
. Después de leer esta respuesta , pensé que no debería ser demasiado difícil encontrar un ejemplo simple. Quiero usar std::enable_if
para elegir entre dos funciones miembro y permitir que solo se use una de ellas.
Desafortunadamente, lo siguiente no se compila con gcc 4.7 y después de horas y horas de intentarlo, les pregunto cuál es mi error.
#include <utility>
#include <iostream>
template< class T >
class Y {
public:
template < typename = typename std::enable_if< true >::type >
T foo() {
return 10;
}
template < typename = typename std::enable_if< false >::type >
T foo() {
return 10;
}
};
int main() {
Y< double > y;
std::cout << y.foo() << std::endl;
}
gcc informa los siguientes problemas:
% LANG=C make CXXFLAGS="-std=c++0x" enable_if
g++ -std=c++0x enable_if.cpp -o enable_if
enable_if.cpp:12:65: error: `type' in `struct std::enable_if<false>' does not name a type
enable_if.cpp:13:15: error: `template<class T> template<class> T Y::foo()' cannot be overloaded
enable_if.cpp:9:15: error: with `template<class T> template<class> T Y::foo()'
¿Por qué g ++ no elimina la instanciación incorrecta para la función del segundo miembro? Según el estándar, std::enable_if< bool, T = void >::type
solo existe cuando el parámetro de la plantilla booleana es verdadero. Pero, ¿por qué g ++ no considera esto como SFINAE? Creo que el mensaje de error de sobrecarga proviene del problema de que g ++ no elimina la función del segundo miembro y cree que esto debería ser una sobrecarga.
std::is_same< T, int >::value
y ! std::is_same< T, int >::value
que le da el mismo resultado.