Ergebnistypen



  • Hallo mal wieder,
    sagen wir, ich habe in einem Template die (eventuell dekorierten und wahrscheinlich integralen) Typen T1 und T2 und möchte nun wissen, welchen Typ das Resultat von T1()/T2() hat. Ist dann decltype(T1()/T2()) der richtige (tm) Weg, an den Typ zu gelangen?

    Ich bräuchte das für zB. eine Punktklasse:

    template< typename TX1, typename TY1, typename TX2, typename TY2 >
    const SizeT< decltype(TX1()-TX2()), /*...*/ > operator-( const PointT<TX1,TY1>&, const PointT<TX2,TY2>&)
    {
      // ...
    }
    

    Ich möchte halt, dass im Prinzip der gleiche Code inklusive Typen usw. erzeugt wird, wie wenn ich die Operationen per Hand ausschreiben würde.

    Beste Grüße,
    Deci


  • Mod

    Ja, decltype ist hier eine Möglichkeit. Dein Beispiel ist sehr kurz, vielleicht kommt auch ein automatisch bestimmter Rückgabetyp infrage wie bei folgendem Sinnlosbeispiel:

    template<typename T1, typename T2>
    auto add(const T1& t1, const T2& t2) -> decltype(t1 + t2)
    {
     return t1 + t2;
    }
    


  • Okay, danke Dir, der auto-Weg ginge auch, danke für den Tipp.
    Ich frage mich, ob ich hier vielleicht ein bisschen übertreibe. Wenn die Punkte auch Referenzen usw. halten können, braucht man ziemlich schnell ziemlich viel <type_traits>-Zeug.
    Aber nur so kann ich zip_iteratoren basteln, bei denen die X-Koordinaten fest sind und nur die Y-Koordinaten verändert werden können, mit der gleichen komfortablen Point-Schnittstelle... hrmmhrmmm.



  • Mit auto()-> würde ich das auch machen. Alternativ erzeugt man Ausdrücke eines bestimmten Typs zwecks Typ-Deduktion per std::declval

    typedef decltype(declval<int>()/declval<double>()) etyp;
    

    declval ist ein Funktionstemplate im std Namensraum, was man über <utility> bekommt.


Anmelden zum Antworten