Sto cercando di ottenere un semplice esempio per capire come utilizzare std::enable_if
. Dopo aver letto questa risposta , ho pensato che non sarebbe stato troppo difficile trovare un semplice esempio. Voglio usare std::enable_if
per scegliere tra due funzioni membro e consentire l'utilizzo solo di una di esse.
Sfortunatamente, quanto segue non viene compilato con gcc 4.7 e dopo ore e ore di tentativi, sto chiedendo a voi ragazzi qual è il mio errore.
#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 segnala i seguenti problemi:
% 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()'
Perché g ++ non elimina l'istanza errata per la funzione del secondo membro? Secondo lo standard, std::enable_if< bool, T = void >::type
esiste solo quando il parametro del modello booleano è true. Ma perché g ++ non lo considera SFINAE? Penso che il messaggio di errore di sovraccarico provenga dal problema che g ++ non cancella la funzione del secondo membro e ritiene che questo dovrebbe essere un sovraccarico.
std::is_same< T, int >::value
e ! std::is_same< T, int >::value
che dà lo stesso risultato.