2016-06-09 12 views
8

Ecco cosa voglio fare:Un modo migliore per disabilitare la deduzione dei parametri del template basata su argomenti per le funzioni?

template <typename T> void f(DisableDeduction<T> obj) {std::cout << obj;} 
// Here DisableDeduction<T> aliases T, but in a such way 
// that would prevent compiler from deducing T based 
// on provided argument. 

/* ... */ 

f<int>(1); // Works. 
f(1); // Error, can't deduce template parameter based on argument. 

Ecco come ho attualmente realizzarlo:

template <typename T> struct DisableDeduction_Internal {using type = T;}; 
template <typename T> using DisableDeduction = typename DisableDeduction_Internal<T>::type; 

Funziona perfettamente (come descritto), ma introduce un tipo di supporto aggiuntivo.

Ma posso ottenere lo stesso risultato senza tipi aggiuntivi?

+3

'std :: enable_if_t '? – Jarod42

+0

@ Jarod42, ti dispiacerebbe trasformarlo in una risposta con un esempio funzionante? –

risposta

6

si può fare mettendo T in un contesto non deducibili (a sinistra di ::), e utilizzare std::common_type da <type_traits>.

esempio:

template <typename T> void f(typename std::common_type<T>::type obj) {std::cout << obj;} 
+0

Grazie. Lo inserirò in un template che usa (come prima) per un uso più conveniente. – HolyBlackCat

Problemi correlati