2014-09-16 11 views
6

Uaktualniam część mojej bazy z C++ 11 na C++ 14. Mam kilka funkcji narzędzia matematycznego, które pobierają wiele argumentów wejściowych i zwracają pojedynczą wartość typu std::common_type_t<...>.Czy zawsze bezpieczne jest korzystanie z dedukcji zwrotu funkcji automatycznych C++ 14 w miejsce std :: typ_typowy?

Zastanawiam się nad zastąpieniem jawnej wartości zwracanej prostym auto. Wydaje mi się, że w tych przypadkach odliczenie typu próbuje znaleźć typowy typ. Czy jest jakiś przypadek, w którym to nie zadziała?

Czy jest zawsze bezpieczne konwertować wszystkie wystąpienia std::common_type_T<...> zwracanych wartości z auto?

przykład funkcja:

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

Nie, ale?: Ma wspólny typ. –

+0

Czy mogę zapytać, dlaczego bierzesz argumenty różnych typów dla takiej funkcji, a nie tylko jednego typu? – mattnewport

+0

@mattnewport: Prawdopodobnie dlatego, że nie można tego inaczej wydedukować. Pomyśl 'std :: min (1, 1.)'. W tym konkretnym przypadku lepiej byłoby zapobiec odliczeniu na min/max, ale nie ma to zastosowania w przypadku ogólnym. –

Odpowiedz

7

Nie, to nie zawsze jest bezpieczne.

Zakładam, że twoje funkcje matematyczne robią więcej niż to, ale tutaj jest przykład, w którym wynik będzie inny.

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

Jeśli wywołać tę funkcję z dwoma char s wynik będzie char. Czy automatycznie wyprowadziłbyś typ zwrotu, który dałby int.

+0

@ Jarod42 Łatwo przeoczyć, ale użył 'std :: typ_typu_ostatecznego, a nie' std :: typ_typowy'. Oznacza to, że nie musisz otaczać cechy za pomocą 'typename std :: XXX :: type'. Jednak jest to ważne tylko w C++ 14. –

+0

@PhilWright: Mój komentarz był przed edycją Vittorio. Ale dzięki, teraz mogę usunąć mój przestarzały komentarz. – Jarod42

Powiązane problemy