如何找到两种整数类型中最大的(按大小)?

7
例如:
template <typename Type1, typename Type2>
void fun(const Type1 &v1, const Type2 &v2)
{
    largest<Type1, Type2>::type val = v1 + v2;
    .
    .
    .
};

我想知道是否有一个“最大”的东西存在,也许在boost库中有。

相关:https://dev59.com/KnRC5IYBdhLWcg3wROtQ - Josh Lee
жӮЁиҝҳеҸҜд»ҘдҪҝз”ЁжӯӨи§ЈеҶіж–№жЎҲзҡ„uac_typeжЁЎжқҝпјҡhttps://dev59.com/questions/EHNA5IYBdhLWcg3wWsYA#998982гҖӮдј е…ҘдёҚеҗҢзұ»еһӢпјҢиҺ·еҸ–зј–иҜ‘еҷЁйҖүжӢ©зҡ„з»“жһңзұ»еһӢгҖӮ - Johannes Schaub - litb
5个回答

14
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
他指定了“大小”而不是范围,所以我猜两者的大小是相同的。 - Alex Brown
1
@Neil Butterworth:好的,好的。为什么要重复两次呢?我已经按照您的要求插入了; - Alexey Malistov
我个人认为,仍然无法正常工作。例如,largest <int,double> d; cout << sizeof(d) << endl; 应该打印出8,但实际上它打印出1。 - anon
5
@Neil Butterworth:largest<int,double>::type d; cout<<sizeof(d)<<endl;输出8。 注意!是largest<int,double>::type而不是largest<int,double> - Alexey Malistov
我只对有符号整数类型感兴趣,所以这样做就可以了。谢谢Alexey! - chila
显示剩余6条评论

3

没有简单的答案。如果你的机器上最大的类型是long,而传递的两种类型分别为unsigned long和signed long,那么你期望val是什么类型?如果选择unsigned,你可能会遇到一个不能放入其中的负数。如果选择signed,你可能会溢出,但仍然有一个数字可以适合无符号数字空间。

如果这些限制是可以接受的,你可以使用Alexey Malistov的方法,但如果Type1和Type2大小相同但类型不同,则结果类型将取决于传递值的顺序。

看一下boost mpl函数if_,你可以选择两种类型中的一种。你需要自己制定规则来选择结果类型。


虽然他只对特定类型(有符号整数)感兴趣,但我很高兴你提出这个问题。 - joshperry
你说得对。这两个积分应该都是有符号或无符号的。在我的情况下,我对有符号的感兴趣,但你的评论是正确的。 - chila

1

这样做可能不太可行。你如何区分unsigned int和int?你不能使用sizeof(),因为它们在内存中的“大小”是相同的。我认为你将不得不编写自己的模板特化来处理这些情况,此时我建议只使用重载函数。


既然他要求最大(尺寸上),我认为这不是问题。 - Alex Brown
请参阅http://en.wikipedia.org/wiki/Integer_(computer_science)。请查看Stephen的答案,他的回答比我的更深入。 - wheaties
你说得对。这两个积分应该都是有符号或无符号的。在我的情况下,我对有符号的感兴趣,但你的评论是正确的。 - chila

-1

-1

你可以使用 C 语言内置函数 sizeof 来获取类型的内存大小。你也可以在类型的实例上调用它。例如:

return (sizeof(v1) > sizeof(v2));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接