Result type von std::tuple_cat

07/10/2015 - 14:40 von Helmut Zeisel | Report spam
Ich habe eine Funktion der Art:

template<typename A, typename B> result_type f(const A&, const B&)
{
...
typename A::some_type tupleA;
typename B::some_type tupleB;
...

return std::tuple_cat<tupleA, tuple B>;
}

tupleA und tupleB sind dabei irgendwelche std::tuple mit nicht nàher spezifizerten Komponenten.

Frage: wie kann ich result_type spezifzieren?

Möglichkeit 1:

typename A::some_type tA;
typename B::some_type tB;

typedef decltype(std::tuple_cat(tA,tB)) result_type;

Das funktioniert zwar,
ich will aber keine nichtvewendeten Variablen deklarieren.



Möglichkeit 2:

typedef decltype(std::tuple_cat(typename A::some_type,
typename B::some_type)) result_type;

liefert beim Compilieren: "illegal use of this type as an expression"



Möglichkeit 3:

typedef std::result_of<std::tuple_cat(tA, tB)>::type result_type;

liefert beim Compilieren:

"'std::result_of': invalid template argument for '_Fty', type expected"


Möglichkeit 4:

Ich schreibe eine eigene Klasse tuple_cat_traits und verwende

tuple_cat_traits<typename A::some_type, typename A::some_type>::return_type


Meine Frage: ist es wirklich notwendig, dass ich so eine Klasse wie tuple_cat_traits selber schreibe? Gibt es evtl. im C++ Standard eine vorgefertigte Lösung dazu (àhnlich wie die Möglichkeit 2 oder 3 oben, aber "richtig")?

Helmut
 

Lesen sie die antworten

#1 Helmut Zeisel
07/10/2015 - 15:36 | Warnen spam
Am Mittwoch, 7. Oktober 2015 14:50:04 UTC+2 schrieb Helmut Zeisel:

Möglichkeit 2:

typedef decltype(std::tuple_cat(typename A::some_type,
typename B::some_type)) result_type;



Ich habe dazu jetzt doch noch Folgendes gefunden:

http://stackoverflow.com/questions/...e-function

"To declare x to be the return type of f applied to an int, simply write this:

decltype(f(int{})) x;"

Das klingt schon sehr gut; allerdings enthalten meine std::tuple Referenzen:
Im Prinzip also:

typedef std::tuple<int&> tI;
typedef std::tuple<double&> tD;

typedef decltype(std::tuple_cat(tI{}, tD{})) result_type;

Unter VC 2015 compiliert das auch; GCC 4.9.3 (cygwin) liefert aber:

"error: value-initialization of reference type 'double&'"

Welcher Compiler ist da standardkonform?

Helmut

Ähnliche fragen