Articles of sfinae

Spiega C ++ SFINAE in un programmatore non C ++

Cos’è SFINAE in C ++? Puoi spiegarlo in parole comprensibili a un programmatore che non è esperto in C ++? Inoltre, quale concetto in una lingua come Python corrisponde a SFINAE?

Rilevare constexpr con SFINAE

Sto lavorando per aggiornare alcuni codici C ++ per sfruttare le nuove funzionalità in C ++ 11. Ho una class dei caratteri con alcune funzioni che restituiscono tipi fondamentali che, nella maggior parte dei casi, potrebbero restituire un’espressione costante, ma non sempre. Mi piacerebbe fare cose diverse in base al fatto che la funzione sia […]

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 […]