Si consideri il seguente:Specializzazione del modello C++ basato sulla presenza/assenza di un membro della classe?
struct A {
typedef int foo;
};
struct B {};
template<class T, bool has_foo = /* ??? */>
struct C {};
voglio specializzarmi C in modo che C <Un> ottiene una specializzazione e C <B> ottiene l'altro, in base alla presenza o assenza di typename T :: foo. È possibile ciò usando tratti tipografici o qualche altro modello magico?
Il problema è che tutto ciò che ho provato produce un errore di compilazione durante l'istanziazione di C <B> perché B :: pippo non esiste. Ma è quello che voglio testare!
Edit: Penso risposta di Ildjarn è meglio, ma alla fine mi si avvicinò con la seguente soluzione C++ 11. L'uomo è hacky, ma almeno è breve. :)
template<class T>
constexpr typename T::foo* has_foo(T*) {
return (typename T::foo*) 1;
}
constexpr bool has_foo(...) {
return false;
}
template<class T, bool has_foo = (bool) has_foo((T*)0)>
Si dovrebbe aver detto che eri interessato a una soluzione C++ 11. : -] Il tuo va bene, ma il sovraccarico di 'has_foo (T *)' potrebbe essere migliorato restituendo 'bool' e usando l'espressione SFINAE, quindi nessun cast è necessario nel callsite. – ildjarn
'(T *) 0)' dovrebbe essere 'declval()', probabilmente –
Lol4t0