template<class T>
struct is_builtin
{
enum {value = 0};
};
template<>
struct is_builtin<char>
{
enum {value = 1};
};
template<>
struct is_builtin<int>
{
enum {value = 1};
};
template<>
struct is_builtin<double>
{
enum {value = 1};
};
template<class T>
struct My
{
typename enable_if<is_builtin<T>::value,void>::type f(T arg)
{
std::cout << "Built-in as a param.\n";
}
typename enable_if<!is_builtin<T>::value,void>::type f(T arg)
{
std::cout << "Non - built-in as a param.\n";
}
};
struct A
{
};
int main()
{
A a;
My<int> m;
My<A> ma;
m.f(1);
ma.f(a);
return 0;
}
sto ottenendo un errore:
error C2039: 'type' : is not a member of 'std::tr1::enable_if<_Test,_Type>'
Ovviamente non capisco come utilizzare enable_if
. Quello che stavo pensando è che posso abilitare una o la seconda funzione membro da un insieme di funzioni membro durante il tempo di compilazione, ma non funziona. Qualcuno potrebbe spiegarmi come farlo correttamente?
Modificato
Quello che davvero non riesco a capire è perché non ci sia typedef
in uno di quelli def. Il compilatore non riesce a trovarlo e non lo compila.
potrebbe fornire qualche esempio per favore? –
@C'è un esempio di utilizzo del secondo approccio (specializzazione di un modello di classe) in [la documentazione Boost 'enable_if'] (http://beta.boost.org/doc/libs/1_44_0/libs/utility/enable_if .html) (vedere la sezione 3.1). –
grazie per il collegamento. Andando a leggerlo ora. –