是否有技术限制阻止内置插件使用静态成员?

时间:2012-01-07 20:11:24

标签: c++ language-design

我发现这很残忍:

std::numeric_limits<int>::max()

真的希望我能写下这个:

int::max

是的,有INT_MAX和朋友。但有时候你会处理像streamsize这样的东西,它是未指定内置的同义词,因此你不知道是应该使用INT_MAX还是LONG_MAX或其他什么。是否有技术限制阻止将int::max这样的内容放入语言中?或者只是除了我以外没人会对它感兴趣吗?

3 个答案:

答案 0 :(得分:4)

原始类型不是类类型,因此它们没有静态成员,就是它。

如果你让他们成为类类型,那么你正在改变语言的基础(虽然考虑到这一点,出于兼容性原因,它不会是这样的问题,更像是标准人员的一些头痛准确找出要添加到其中的成员。)

但更重要的是,我认为除了你之外没有人对它感兴趣:);我个人并不认为numeric_limits如此残暴(实际上,它非常C ++ - 是的 - 虽然很多人可以说C ++经常是什么 - 看起来很糟糕:P)。


总而言之,我会说这是通常的"every feature starts with minus 100 points"点;这篇文章讨论了C#,但它对C ++来说更具相关性,它已经拥有大量的语言特性和细微之处,复杂的标准和许多可以提出否决权的编译器供应商:

  

这样做的一种方法是通过“减去100分”的概念。每个特征都在洞中开始100分,这意味着它必须对整个包具有显着的净正面影响才能使其成为语言。有些功能对于某种语言来说是可以使用的功能,它们只是不足以使它成为语言。

即使该提案是由其他人精心准备的,标准委员会仍需要时间来审查和讨论它,并且它可能会被拒绝,因为它可能是没有问题的重复。

答案 1 :(得分:2)

实际上存在多个问题:

  1. 内置类型不是C ++中的类
  2. 类不能使用C ++中的新成员进行扩展
  3. 假设实施需要提供某些“成员”:哪个?您可能希望为类型找到许多其他属性,使用特征可以添加它们。
  4. 那就是说,如果你觉得你想要更短的符号,那就创建它:

    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 ++委员会决定的。