Rückgabewert einer Funktion als Typ einer Variablen
-
Ich will ein Array von chrono::duration_castchrono::microseconds anlegen und den Typ vom Compiler selbst bestimmen lassen.
Momentan behelfe ich mir, indem ich die Funktion einmal aufrufe
auto start = chrono::high_resolution_clock::now(); auto stop = chrono::high_resolution_clock::now(); auto duration = chrono::duration_cast<chrono::microseconds>(stop - start); vector<decltype(chrono::duration_cast<chrono::microseconds>(duration))> all_times;
Wie kann ich den verctor anlegen, ohne zuvor den duration_cast durchführen zu müssen?
-
Du gibst doch beim
duration_cast
explizit den Rückgabetyp an, also warum nicht gleichvector<chrono::microseconds> all_times;
?
-
@salomeswish sagte in Rückgabewert einer Funktion als Typ einer Variablen:
duration
duration
ist doch schonchrono::microseconds
... warum castest du nochmal?
-
Ok, in dem Fall ist das sehr einfach, aber wie ginge es, wenn ich den Typ nicht wüsste?
-
@salomeswish sagte in Rückgabewert einer Funktion als Typ einer Variablen:
Ok, in dem Fall ist das sehr einfach, aber wie ginge es, wenn ich den Typ nicht wüsste?
Wenn du einen Cast machen kannst, kennst du den Typ.
-
@salomeswish sagte in Rückgabewert einer Funktion als Typ einer Variablen:
Ok, in dem Fall ist das sehr einfach, aber wie ginge es, wenn ich den Typ nicht wüsste?
Du bitte zeigen eine Beispiel mit was du genau wollen. In einer stark typisierten Sprache wie C++ den Typ den man will nicht zu kennen ist schon fast ein Kunststück.
-
Meinst du das?
#include <vector> #include <type_traits> int const& mystery_fn(); // Die Funktion mit unbekanntem Rückgabetyp void test() { std::vector<std::remove_cv_t<std::remove_reference_t<decltype(mystery_fn())>>> vec; vec.push_back(mystery_fn()); vec.push_back(mystery_fn()); vec.push_back(mystery_fn()); }
-
@swordfish sagte in Rückgabewert einer Funktion als Typ einer Variablen:
In einer stark typisierten Sprache wie C++ den Typ den man will nicht zu kennen ist schon fast ein Kunststück.
Bei Templates kommt das doch dauernd vor...?
-
@hustbaer Wie kann der Rückgabetyp eines instanziierten Templates unbekannt sein?
-
@Swordfish
Nicht der Rüykgabetyp des Templates das man gerade programmiert, sondern der Rüykgabetyp von "abhängigen" Funktionen die man in der Implementierung des Templates verwendet.template <class T> void foo(T const& t) { auto id = t.id(); // Welchen Typ hat die Variable? } template <class T, class U> void foo(T const& t, U const& u) { auto sum = t + u; // Welchen Typ hat die Variable? }
Wenn man nur eins davon braucht, ist
auto
gut. Wenn man aber nenvector
braucht, kann manauto
nicht mehr verwenden - zumindest nicht mehr direkt.ps: Ich habe auch nicht "instanziertes" Template geschrieben. Denn ein instanziertes Template ist kein Template mehr, und natürlich ist da dann alles bekannt. Schreiben tut man aber normalerweise nicht vollständig spezialisierte Templates, und da weiss man dann nicht was beim Spezialisieren mal rauskommen wird, da der ganze Sinn von Templates ja ist dass man sie mit unterschiedlichen Parametern instanzieren kann.
Aus dem Grund haben auch die ganzen Class-Templates in der Standard Library nested typedefs alasize_type
,iterator
,value_type
etc. Weil es vor C++11 sonst oft nicht möglich gewesen wäre diese sinnvoll in eigenen Templates zu verwenden.