Articles of sfinae

SFINAE funziona in modo diverso nei casi di parametri modello tipo e non tipo

Perché questo codice funziona: template< typename T, std::enable_if_t<std::is_same::value, T>* = nullptr> void Add(T) {} template< typename T, std::enable_if_t<!std::is_same::value, T>* = nullptr> void Add(T) {} e può distinguere correttamente tra queste due chiamate: Add(1); Add(1.0); mentre il seguente codice, se compilato, comporta la ridefinizione dell’errore di Add () ? template< typename T, typename = typename std::enable_if<std::is_same::value, […]

Come rilevare l’esistenza di una class usando SFINAE?

È ansible rilevare se esiste una class in C ++ usando SFINAE ? Se ansible, allora come? Supponiamo di avere una class fornita solo da alcune versioni di una libreria. Mi piacerebbe sapere se è ansible utilizzare SFINAE per rilevare se la class esiste o meno. Il risultato del rilevamento è arbitrario, diciamo una costante […]

Usando SFINAE per verificare l’operatore globale <<?

Voglio avere diverse funzioni globali to_string() sovraccaricate che prendono un tipo T e lo convertono nella sua rappresentazione di stringa. Nel caso generale, voglio essere in grado di scrivere: template inline typename enable_if<!std::is_pointer::value && has_insertion_operator::value, void>::type to_string( T const &t, OutputStringType *out ) { std::ostringstream o; o << t; *out = o.str(); } La mia […]

controlla se il membro esiste usando enable_if

Ecco cosa sto cercando di fare: template struct Model { vector vertices ; #if T has a .normal member void transform( Matrix m ) { each vertex in vertices { vertex.pos = m * vertex.pos ; vertex.normal = m * vertex.normal ; } } #endif #if T has NO .normal member void transform( Matrix m […]

Specializzazione del modello e problemi enable_if

Sto riscontrando un problema relativo all’uso appropriato di enable_if e della specializzazione del modello. Dopo aver modificato l’esempio (per motivi di riservatezza), ecco un esempio comparabile: Ho una funzione chiamata “less” che controlla se 1st arg è inferiore a 2nd arg. Diciamo che voglio avere 2 diversi tipi di implementazioni a seconda del tipo di […]

Cosa è decltype con due argomenti?

Modifica, per evitare confusione: decltype non accetta due argomenti. Vedi le risposte. Le seguenti due strutture possono essere utilizzate per verificare l’esistenza di una funzione membro su un tipo T durante la compilazione: // Non-templated helper struct: struct _test_has_foo { template static auto test(T* p) -> decltype(p->foo(), std::true_type()); template static auto test(…) -> std::false_type; }; […]

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?