Scott Meyers ha pubblicato il contenuto e lo stato del suo prossimo libro EC ++ 11. Ha scritto che un articolo del libro potrebbe essere "Evita le std::enable_iffirme delle funzioni" .
std::enable_if può essere utilizzato come argomento di funzione, come tipo restituito o come modello di classe o parametro di modello di funzione per rimuovere condizionalmente funzioni o classi dalla risoluzione di sovraccarico.
In questa domanda sono mostrate tutte e tre le soluzioni.
Come parametro di funzione:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
Come parametro del modello:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
Come tipo di ritorno:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- Quale soluzione dovrebbe essere preferita e perché dovrei evitare gli altri?
- In quali casi "Evita
std::enable_ifnelle firme di funzione" riguarda l'utilizzo come tipo di restituzione (che non fa parte della normale firma della funzione ma delle specializzazioni del modello)? - Ci sono differenze per i modelli di funzioni membri e non membri?
std::enable_ifingombrare le mie firme di funzione (specialmente la brutta nullptrversione dell'argomento della funzione aggiuntiva ) perché sembra sempre quello che è, uno strano hack (per qualcosa un static ifpotere fare molto più bello e pulito) usando il template black-magic per sfruttare una caratteristica del linguaggio interessante. Questo è il motivo per cui preferisco il tag-dispatching quando possibile (beh, hai ancora argomenti strani aggiuntivi, ma non nell'interfaccia pubblica e anche molto meno brutta e criptica ).
=0a typename std::enable_if<std::is_same<U, int>::value, int>::type = 0realizzare? Non sono riuscito a trovare le risorse corrette per capirlo. So che la prima parte prima =0ha un tipo di membro intse Ued intè la stessa. Grazie molto!