我们可以使用具有多个返回类型的函数吗?(在C ++ 11及更高版本中)

Kir*_* ND 31 c++ templates function return-type c++11

我试图写一个通用的函数,该函数的输入为uint8uint16uint32uint64,...,并与最大的元素的数据类型返回最大值?

例如:

template < typename T, typename X>
auto Max_Number(T valueA, X valueB)
{
    if (valueA > valueB)
        return valueA;
    else
        return valueB;
}
Run Code Online (Sandbox Code Playgroud)

PS:此示例假定最大元素具有最大数据类型。

son*_*yao 27

返回类型必须在编译时确定。您可能会使用std::common_type(自C ++ 11起):

对于不需要提升的算术类型,可以将通用类型视为(可能是混合模式)算术表达式的类型T0() + T1() + ... + Tn()

template < typename T, typename X>
typename std::common_type<T, X>::type Max_Number ( T valueA, X valueB ) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

或使用std::conditional(自C ++ 11起)将返回类型声明为大类型(返回sizeof值更大)。

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

请注意,在这种情况下,如果TX具有相同的大小,T将始终用作返回类型。如果要更精确地控制它,可以使用一些特征来指定确切的类型。

  • 当T和X的大小相同时,后一种解决方案可能会带来不可交换的缺点,例如,在我的系统上,“ Max_Number(1L,2.0)”返回一个long int,而“ Max_Number(2.0,1L)”返回一个double。(此外,`std :: conditional_t`帮助器仅在C ++ 14中可用。) (6认同)

Obl*_*ica 13

这是一个示例解决方案 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是正确的,但在某些情况下,`std :: variant`可能会过大,因为其他完全可用C ++ 11提供的解决方案。 (5认同)

JeJ*_*eJo 10

条件运算符尾随返回是另一种方法,自起可用。

在线观看

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

在此处查看使用尾随返回类型的一些优点:在C ++ 11函数中使用尾随返回类型的优点