Kir*_* ND 31 c++ templates function return-type c++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;
}
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)
请注意,在这种情况下,如果T
和X
具有相同的大小,T
将始终用作返回类型。如果要更精确地控制它,可以使用一些特征来指定确切的类型。
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)
JeJ*_*eJo 10
带条件运算符的尾随返回是另一种方法,自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;
}
Run Code Online (Sandbox Code Playgroud)
在此处查看使用尾随返回类型的一些优点:在C ++ 11函数中使用尾随返回类型的优点