Il modo per utilizzare questa funzione per utilizzare std::enable_if
in una forma o in una forma. Il selettore per il tipo supportato viene quindi utilizzato come tipo di ritorno. Per esempio:
template <typename T> struct is_supported { enum { value = false }; };
template <> struct is_supported<int> { enum { value = true }; };
template <> struct is_supported<float> { enum { value = true }; };
template <> struct is_supported<double> { enum { value = true }; };
template <typename T>
typename std::enable_if<is_supported<T>::value, T>::type
restricted_template(T const& value) {
return value;
}
Ovviamente, si vuole dare i tratti un nome migliore di is_supported
. std::enable_if
fa parte di C++ 2011 ma è facilmente implementato o ottenuto da boost nel caso in cui non sia disponibile con la libreria standard che si sta utilizzando.
In generale, spesso non è necessario imporre restrizioni esplicite in quanto l'implementazione del modello presenta in genere limitazioni implicite. Tuttavia, a volte è utile disabilitare o abilitare determinati tipi.
fonte
2011-12-29 18:14:48
Per quanto ne so, non in C++ anche in C++ 11, ma le vecchie funzionalità rimosse riguardanti i concetti fanno ciò che volete se ricordo bene. – Geoffroy
@Geoffroy: non esiste un supporto di livello linguistico di base per questo, ma utilizzando enable_if può essere fatto (vedere la mia risposta). Può essere un po 'macchinoso, ma posso immaginare alcuni tipi di helper che potrebbero dare questa sintassi più bella in C++ 2011 usando modelli variadic (non ho ancora sperimentato questo, tuttavia). –
Vuoi applicare la stessa definizione per i tipi supportati o devi definirla in modo diverso per ognuno? cioè 'f' ha esattamente lo stesso corpo di 'f '? –