Можем ли мы иметь функцию с несколькими типами возврата? (в С++ 11 и выше)

Я пытаюсь написать универсальную функцию, которая принимает входные данные как uint8, uint16, uint32, uint64,.... и возвращает максимальное значение с типом данных наибольшего элемента?

Например:

template < typename T, typename X>
auto Max_Number(T valueA, X valueB)
{
    if (valueA > valueB)
        return valueA;
    else
        return valueB;
}

P.S: в этом примере предполагается, что самый большой элемент имеет самый большой тип данных.

Ответы

Ответ 1

Тип возврата должен быть определен во время компиляции. Вы можете использовать std::common_type (начиная с С++ 11):

Для арифметических типов, не подлежащих продвижению, общий тип может рассматриваться как тип арифметического выражения (возможно, смешанного режима), например T0() + T1() + ... + Tn().

template < typename T, typename X>
typename std::common_type<T, X>::type Max_Number ( T valueA, X valueB ) {
    ...
}

Или используйте std::conditional (начиная с С++ 11), чтобы объявить тип возвращаемого значения как большой (у которого sizeof больше).

template < typename T, typename X>
typename std::conditional<sizeof(T) >= sizeof(X), T, X>::type Max_Number ( T valueA, X valueB ) {
    ...
}

Обратите внимание, что в этом случае, если T и X имеют одинаковый размер, T всегда будет использоваться в качестве возвращаемого типа. Если вы хотите контролировать это более точно, вы можете использовать некоторые черты, чтобы указать точный тип.

Ответ 2

Вот пример решения с std:: variant

template < typename T, typename X> 
std::variant<T, X>  Max_Number ( T valueA, X valueB )
{
    std::variant<T, X> res;
    if ( valueA > valueB ) 
       res = valueA; 
    else 
       res = valueB; 
    return res;
}

Ответ 3

Конечный возврат с условным оператором conditional operator - это еще один способ, который доступен с .

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

template <typename T, typename X>
constexpr auto Max_Number(T valueA, X valueB)-> decltype(valueA > valueB ? valueA : valueB)
{
    return valueA > valueB ? valueA : valueB;
}

Смотрите некоторые преимущества использования конечного типа возврата здесь: Преимущество использования конечного типа возврата в функциях С++ 11