per decltype den Rückgabetyp bestimmen
-
Hallo,
ich mache gerade die ersten Schritte in C++11 und habe schon ein Problem

Ich habe eine Funktion, die zwei Parameter entgegennimmt und abhängig von den Parametertypen einen bestimmten Rückgabetyp haben soll. Wennlhskleiner alsrhsist soll der RückgabetypTsein, sonstU. Wie muss ich den Ausdruck indecltypeformulieren, um das zu erreichen?template<typename T, typename U> auto minimum( const T& lhs, const U& rhs ) -> decltype( hm? ) { if( lhs < rhs ) return lhs; else return rhs; }
-
Nun, ich glaube nicht, dass dein Vorhaben möglich ist.
lhs und rhs sind erst zur Laufzeit bekannt und decltype ist reine Compiler-Magie.
-
DocShoe schrieb:
Wenn
lhskleiner alsrhsist soll der RückgabetypTsein, sonstU. Wie muss ich den Ausdruck indecltypeformulieren, um das zu erreichen?Die Werte von lhs und rhs sind erst zur Laufzeit bekannt, der Typ des Rückgabewerts einer Funktion muss aber zur Compiletime festgelegt werden. Was du willst ist also rein prinzipiell unmöglich.
-
Autsch, stimmt. Dann behelfe ich mir mit
decltype( T{} - U{} ), das sollte eigentlich auch reichen.
-
Wieso eigentlich nicht einfach
std::min()nehmen?
-
3 Bemerkungen:
- ich würde vermutlichdecltype(lhs - rhs)(oder + stat -, wenn das bei dir dasselbe ist) bevorzugen stattT{}undU{}
- ggf. kann deine Funktion zu unerwarteten Konvertierungen führen (deswegen ist bei std::min auch 2x derselbe Typ)
- Es gibt auch common_type, falls das für dich gerade passend ist
-
Oder einfach:
template<typename T, typename U> auto minimum(const T& lhs, const U& rhs) { return lhs < rhs ? lhs : rhs; }
-
naja, es ist schon etwas schwieriger

Es ist nicht ein Datentyp, sondern sowas zwei vektoren. Die Funktion soll einen Ergebnisvektor bilden, die das kleinste Element der jeweiligen Position enthält.
template<typename T, typename U> static auto mininum( const std::vector<T>& lhs, const std::vector<U>& rhs ) -> std::vector<decltype( T{} - U{} )> { using R = decltype( T{} - U{} ); std::vector<R> tmp( lhs ); std::transform( tmp.begin(), tmp.end(), rhs.begin(), tmp.begin(), []( const T& v1, const U& v2 ) { if( v1 < v2 ) return v1; else return v2; } ); return tmp; }
-
wie wär's damit:
using R = decltype(lhs < rhs ? lhs : rhs);
-
Ich mach mir da morgen mal in Ruhe Gedanken drüber.
Auf jeden Fall schon mal Danke an alle für die Denkanstöße.