c++ - Как получить результирующий тип умножения двух разных типов?




class c++11 (2)

В дополнение к другим ответам, если вам не нужен result_type для последующего использования, а нужно только указать тип возвращаемого значения operator() , есть и другой способ, не определяя псевдоним для result_type в c ++ 11 .

Вы можете указать конечный тип возврата вместе с auto возвратом следующим образом:

template< typename TA, typename TB>
struct multiplier
{
    auto operator()(TA a, TB b) const -> decltype(a * b)
//  ^^^^^                             ^^^^^^^^^^^^^^^^^^^
    {
        return a * b;
    }
};

( Смотрите в прямом эфире онлайн )

Как можно получить результирующий тип умножения двух разных типов, т.е.

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;
    }
};

Я знаю, что в C ++ совершенно правильно умножить два числовых значения разного типа, и это даст значение в типе, который известен компилятору. Т.е. умножение double и int приведет к ответу типа double .

Таким образом, в шаблонном классе, где типы известны во время компиляции, должна быть возможность определить тип, который будет создан. Действительно, лямбда может быть создана для возврата результата этого значения, т.е.

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

Это приведет к тому, что c будет float .

Обратите внимание, что я ограничен в возможности использовать только функции c ++ 11 или ниже.


Вы можете использовать decltype чтобы сделать это:

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




return-type