我发现这很残忍:
std::numeric_limits<int>::max()
真的希望我能写下这个:
int::max
是的,有INT_MAX
和朋友。但有时候你会处理像streamsize
这样的东西,它是未指定内置的同义词,因此你不知道是应该使用INT_MAX
还是LONG_MAX
或其他什么。是否有技术限制阻止将int::max
这样的内容放入语言中?或者只是除了我以外没人会对它感兴趣吗?
答案 0 :(得分:4)
原始类型不是类类型,因此它们没有静态成员,就是它。
如果你让他们成为类类型,那么你正在改变语言的基础(虽然考虑到这一点,出于兼容性原因,它不会是这样的问题,更像是标准人员的一些头痛准确找出要添加到其中的成员。)
但更重要的是,我认为除了你之外没有人对它感兴趣:);我个人并不认为numeric_limits
如此残暴(实际上,它非常C ++ - 是的 - 虽然很多人可以说C ++经常是什么 - 看起来很糟糕:P)。
总而言之,我会说这是通常的"every feature starts with minus 100 points"点;这篇文章讨论了C#,但它对C ++来说更具相关性,它已经拥有大量的语言特性和细微之处,复杂的标准和许多可以提出否决权的编译器供应商:
这样做的一种方法是通过“减去100分”的概念。每个特征都在洞中开始100分,这意味着它必须对整个包具有显着的净正面影响才能使其成为语言。有些功能对于某种语言来说是可以使用的功能,它们只是不足以使它成为语言。
即使该提案是由其他人精心准备的,标准委员会仍需要时间来审查和讨论它,并且它可能会被拒绝,因为它可能是没有问题的重复。
答案 1 :(得分:2)
实际上存在多个问题:
那就是说,如果你觉得你想要更短的符号,那就创建它:
namespace traits {
template <typename T> constexpr T max() {
return std::numeric_limits<T>::max();
}
}
int m = traits::max<int>();
using namespace traits;
int n = max<int>();
答案 2 :(得分:0)
为什么不使用std::numeric_limits<streamsize>::max()
?至于为什么它是一个函数(max())而不是常量(max),我不知道。在我自己的应用程序中,我创建了自己的num_traits类型,它提供了最大值作为静态常量而不是函数,(并提供了比numeric_limits更多的信息)。
如果他们在“int”本身定义了一些常量和函数,C#有int.MaxValue,int.MaxValue和int.Parse(string)的方式会很好,但这不是C ++委员会决定的。