The return type must be determined at compile-time. You might use std::common_type
(since C++11):
For arithmetic types not subject to promotion, the common type may be viewed as the type of the (possibly mixed-mode) arithmetic expression such as
T0() + T1() + ... + Tn()
.
template < typename T, typename X>
typename std::common_type<T, X>::type Max_Number ( T valueA, X valueB ) {
...
}
Or use std::conditional
(since C++11) to declare the return type as the big one (whose sizeof
is greater).
template < typename T, typename X>
typename std::conditional<sizeof(T) >= sizeof(X), T, X>::type Max_Number ( T valueA, X valueB ) {
...
}
Note that for this case, if T
and X
have the same size, T
will always be used as the return type. If you want to control it more precisely, you can use some traits to specify the exact type.