2014-09-16 11 views
6

Ich aktualisiere einen Teil meiner Codebasis von C++ 11 nach C++ 14. Ich habe mehrere mathematische Dienstprogrammfunktionen, die mehrere Eingabeargumente verwenden und einen einzelnen Wert vom Typ std::common_type_t<...> zurückgeben.Ist es immer sicher, C + 14-Autofunktionstyp Rückführungsabzug anstelle von std :: common_type zu verwenden?

Ich überlege, den expliziten Rückgabewert durch eine einfache auto zu ersetzen. Ich denke, dass Typabzug versucht, in diesen Fällen einen gemeinsamen Typ zu finden. Gibt es einen Fall, wo dies nicht funktionieren würde?

Ist es immer sicher mit auto alle Vorkommen von std::common_type_T<...> Rückgabewerte zu konvertieren?

Beispiel Funktion:

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

Nein, aber?: Hat einen gemeinsamen Typ. –

+0

Kann ich fragen, warum Sie Argumente verschiedener Typen für eine Funktion wie diese nehmen und nicht nur für einen einzigen Typ? – mattnewport

+0

@mattnewport: Wahrscheinlich, weil es sonst nicht abzuleiten ist. Denken Sie 'std :: min (1, 1.)'. In diesem Fall wäre es besser, den Abzug auf Min/Max zu verhindern, im allgemeinen Fall jedoch nicht. –

Antwort

7

Nein, es ist nicht immer sicher.

Ich nehme an, dass Ihre mathematischen Funktionen mehr als das tun, aber hier ist ein Beispiel, wo das Ergebnis anders sein wird.

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

Wenn Sie rufen diese Funktion mit zwei char s das Ergebnis wird ein char sein. Würden Sie den Rückgabetyp automatisch ableiten, würde dies eine int ergeben.

+0

@ Jarod42 Es ist leicht zu verpassen, aber er hat 'std :: common_type_t', nicht' std :: common_type' verwendet. Das bedeutet, dass Sie kein Merkmal mit 'typenname std :: XXX :: type' umgeben müssen. Dies gilt jedoch nur in C++ 14. –

+0

@PhilWright: Mein Kommentar war vor Vittorios Bearbeitung. Aber danke, jetzt kann ich meinen veralteten Kommentar löschen. – Jarod42