c++ - Wie erhält man den resultierenden Typ der Multiplikation zweier verschiedener Typen?




class c++11 (2)

Sie können dazu decltype verwenden:

using result_type = decltype(std::declval<TA&>() * std::declval<TB&>())

Wie würde man vorgehen, um den resultierenden Typ der Multiplikation zweier verschiedener Typen zu erhalten, d.h.

template< typename TA, typename TB>
struct multiplier
{
    using result_type = // something here finds result of TA * TB
    result_type operator()( TA a, TB b ) const
    {
        return a * b;
    }
};

Ich weiß, dass es in C ++ durchaus gültig ist, zwei numerische Werte unterschiedlichen Typs zu multiplizieren, und dies ergibt einen Wert in einem Typ, der dem Compiler bekannt ist. Das heißt, die Multiplikation von double und int ergibt eine Antwort vom Typ double .

Daher sollte es in einer Vorlagenklasse, in der die Typen zur Kompilierungszeit bekannt sind, möglich sein, den zu erstellenden Typ zu bestimmen. In der Tat kann ein Lambda erzeugt werden, um das Ergebnis dieses Wertes zurückzugeben, d. H

auto foo = [](int a, float b){ return a * b;}
auto c = foo( 13, 42.0 );

Dies würde dazu führen, dass c ein float .

Bitte beachten Sie, dass ich nur Funktionen von C ++ 11 oder niedriger verwenden kann.


Sie können hierfür decltype und std::declval . decltype gibt Ihnen den Typ eines Ausdrucks und std::declval "erstellt" ein Objekt des Typs für Sie, auch wenn Sie nicht wissen, wie Sie es konstruieren sollen. Das gibt dir so etwas wie

using result_type = decltype(std::declval<TA&>() * std::declval<TB&>());

Beachten Sie, dass ich lvalue-Referenzen für den Typ verwende. Dies geschieht, weil decval Ihnen standardmäßig eine r-Wert-Referenz gibt, die Ihnen möglicherweise einen anderen Typ gibt.







return-type