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_if
firme 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_if
nelle 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_if
ingombrare le mie firme di funzione (specialmente la brutta nullptr
versione dell'argomento della funzione aggiuntiva ) perché sembra sempre quello che è, uno strano hack (per qualcosa un static if
potere 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 ).
=0
a typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
realizzare? Non sono riuscito a trovare le risorse corrette per capirlo. So che la prima parte prima =0
ha un tipo di membro int
se U
ed int
è la stessa. Grazie molto!