2014-09-16 16 views
6

Sto aggiornando parte della mia base di codice da C++ 11 a C++ 14. Ho diverse funzioni di utilità matematica che accettano più argomenti di input e restituiscono un singolo valore di tipo std::common_type_t<...>.È sempre sicuro utilizzare la deduzione di ritorno del tipo di funzione automatica di C++ 14 al posto di std :: common_type?

Sto pensando di sostituire il valore di ritorno esplicito con un semplice auto. Penso che la deduzione del tipo provi a trovare un tipo comune in questi casi. C'è qualche caso in cui questo non avrebbe funzionato?

E 'sempre sicuro per convertire tutte le occorrenze di std::common_type_T<...> valori di ritorno con auto?

funzione Esempio:

template<typename T1, typename T2, typename T3> 
std::common_type_t<T1, T2, T3> getClamped(T1 mValue, T2 mMin, T3 mMax) 
{  
    return mValue < mMin ? mMin : (mValue > mMax ? mMax : mValue); 
} 
+0

No, ma?: Ha un tipo comune. –

+0

Posso chiedere perché si prendono argomenti di tipi diversi per una funzione come questa e non solo un singolo tipo? – mattnewport

+0

@mattnewport: probabilmente perché non può essere dedotto altrimenti. Pensa a 'std :: min (1, 1.)'. In questo caso particolare sarebbe meglio evitare la detrazione su min/max, ma non si applica nel caso generale. –

risposta

7

No, non è sempre sicuro.

Presumo che le funzioni matematiche facciano di più, ma qui c'è un esempio in cui il risultato sarà diverso.

template <class T, class U> 
std::common_type_t<T, U> add(T t, U u) { return t + u; } 

Se si chiama questa funzione con due char s il risultato sarà un char. Vuoi dedurre automaticamente il tipo di reso, produrrebbe un int.

+0

@ Jarod42 È facile non vederlo, ma ha usato 'std :: common_type_t', non' std :: common_type'. Ciò significa che non è necessario circondare una caratteristica con 'typename std :: XXX :: type'. Tuttavia, questo è valido solo in C++ 14. –

+0

@PhilWright: Il mio commento era precedente alla modifica di Vittorio. Ma grazie, ora posso cancellare il mio commento obsoleto. – Jarod42