例如:
template <typename Type1, typename Type2>
void fun(const Type1 &v1, const Type2 &v2)
{
largest<Type1, Type2>::type val = v1 + v2;
.
.
.
};
我想知道某个地方是否有“最大”,也许是在提升。
答案 0 :(得分:13)
template<bool, typename T1, typename T2>
struct is_cond {
typedef T1 type;
};
template<typename T1, typename T2>
struct is_cond<false, T1, T2> {
typedef T2 type;
};
template<typename T1, typename T2>
struct largest {
typedef typename is_cond< (sizeof(T1)>sizeof(T2)), T1, T2>::type type;
};
答案 1 :(得分:3)
没有简单的答案。如果您机器上的最大类型是long并且传递的两种类型是unsigned long和signed long,那么您期望val是什么类型?如果未签名,则存在负数不适合的风险。如果签名,您可能会溢出但仍有一个适合无符号数字空间的数字。
如果这些限制是可以接受的,你可以使用Alexey Malistov的方法,但是如果Type1和Type2的大小相同,但不同的类型将根据值的传递顺序而有所不同。
查看boost mpl函数if_,您可以使用它选择两种类型中的一种。您需要提出自己的规则来选择结果类型。
答案 2 :(得分:1)
这不太可行。你如何区分unsigned int和int?你不能使用sizeof()因为它们在内存中都是相同的“大小”。我认为你必须推出自己的模板专业化来处理那些我建议只使用重载函数的情况。
答案 3 :(得分:-1)
您可能可以使用sizeof
滚动自己。
答案 4 :(得分:-1)
您可以使用c的sizeof
内置函数来获取该类型的内存大小。您也可以在类型的实例上调用它。例如:
return (sizeof(v1) > sizeof(v2));