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. Wenn lhs kleiner als rhs ist soll der Rückgabetyp T sein, sonst U . Wie muss ich den Ausdruck in decltype formulieren, 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 lhs kleiner als rhs ist soll der Rückgabetyp T sein, sonst U . Wie muss ich den Ausdruck in decltype formulieren, 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 vermutlich decltype(lhs - rhs) (oder + stat -, wenn das bei dir dasselbe ist) bevorzugen statt T{} und U{}
    - 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.


Anmelden zum Antworten