Можем ли мы иметь функцию с несколькими типами возврата? (в С++ 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 - это еще один способ, который доступен с c++11.
(Смотрите онлайн в прямом эфире)
template <typename T, typename X>
constexpr auto Max_Number(T valueA, X valueB)-> decltype(valueA > valueB ? valueA : valueB)
{
return valueA > valueB ? valueA : valueB;
}
Смотрите некоторые преимущества использования конечного типа возврата здесь: Преимущество использования конечного типа возврата в функциях С++ 11