Articles of sfinae

Perché dovrei evitare std :: enable_if nelle firme delle funzioni

Scott Meyers ha pubblicato il contenuto e lo stato del suo prossimo libro EC ++ 11. Ha scritto che un elemento nel libro potrebbe essere “Evita std::enable_if nelle firme di funzioni” . std::enable_if può essere usato come argomento di funzione, come tipo di ritorno o come modello di class o parametro di modello di funzione […]

Esempi di CINA-SFINAE?

Voglio entrare in più meta-programmazione template. So che SFINAE sta per “il fallimento della sostituzione non è un errore”. Ma qualcuno può mostrarmi un buon uso per SFINAE?

Come verificare se l’operatore == esiste?

Sto cercando di creare un esempio, che verificherebbe l’esistenza operator== (membro o funzione non membro). Per verificare se una class ha un operator== membro operator== è facile, ma come verificare se ha un operator== non membro operator== ? Questo è quello che devo fare lontano: #include struct A { int a; #if 0 bool operator==( […]

Qual è esattamente il “contesto immediato” menzionato nello standard C ++ 11 per il quale si applica la SFINAE?

Il paragrafo 14.8.2 / 8 della norma C ++ 11 specifica le condizioni in base alle quali un errore di sostituzione deve o non deve comportare un errore di compilazione “difficile” (causando così il fallimento della compilazione) o un errore “soft” che fare in modo che il compilatore scarti un modello da un gruppo di […]

Cos’è “Expression SFINAE”?

A http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx , il team VC ++ dichiara ufficialmente di non aver ancora implementato la funzione principale di C ++ 11 “Expression SFINAE”. Tuttavia, i seguenti esempi di codice copiati da http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2634.html sono accettati dal compilatore VC ++. Esempio 1: template struct A {}; char xxx(int); char xxx(float); template A f(T){} int main() { f(1); […]

Metaprograming: il fallimento della definizione della funzione definisce una funzione separata

In questa risposta definisco un modello basato sulla proprietà is_arithmetic del tipo: template enable_if_t<is_arithmetic::value, string> stringify(T t){ return to_string(t); } template enable_if_t<!is_arithmetic::value, string> stringify(T t){ return static_cast(ostringstream() << t).str(); } dyp suggerisce che piuttosto che la proprietà is_arithmetic del tipo, che la to_string sia definita per il tipo essere i criteri di selezione del modello. […]

SFINAE per verificare le funzioni dei membri ereditati

Usando SFINAE, posso rilevare se una determinata class ha una certa funzione membro. Ma cosa succede se voglio testare le funzioni dei membri ereditati? Quanto segue non funziona in VC8 e GCC4 (cioè rileva che A ha una funzione membro foo() , ma non che B erediti una): #include template struct has_foo { template struct […]

Come rilevare se esiste una variabile membro specifica in class?

Per creare la funzione template algoritmo ho bisogno di sapere se x o X (e y o Y) in class che è argomento template. Può essere utile quando si utilizza la mia funzione per la class CPoint MFC o GDI + PointF o altri. Tutti usano x differenti in loro. La mia soluzione potrebbe essere […]

Perché le espressioni costanti hanno un’esclusione per un comportamento non definito?

Stavo facendo ricerche su cosa è permesso in un’espressione costante di nucleo * , che è trattato nella sezione 5.19 Espressioni costanti, paragrafo 2 della bozza di standard C ++ che dice: Un’espressione condizionale è un’espressione costante di core a meno che non implichi una delle seguenti espressioni come sottoespressione potenzialmente valutata (3.2), ma sottoespressioni […]

SFINAE funziona nel tipo di ritorno ma non come parametro del modello

Ho già usato l’idioma SFINAE diverse volte e mi sono abituato a inserire il mio std::enable_if nei parametri del modello piuttosto che nei tipi restituiti. Tuttavia, mi sono imbattuto in un caso banale in cui non ha funzionato, e non sono sicuro del perché. Prima di tutto, ecco il mio principale: int main() { foo(5); […]