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 gleich

    vector<chrono::microseconds> all_times;
    

    ?



  • @salomeswish sagte in Rückgabewert einer Funktion als Typ einer Variablen:

    duration

    duration ist doch schon chrono::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 nen vector braucht, kann man auto 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 ala size_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.


Log in to reply