【问题标题】:Overload the 'space' operator in C++?重载 C++ 中的“空格”运算符?
【发布时间】:2011-07-05 23:41:03
【问题描述】:

我在 C++ 方面有一点经验。我知道如何重载加号和什么不,但想重载空间运算符。

例如:

MyObject obj();

result = obj - foo; // This would be treated as a normal '-' operation.

result = obj-foo; // This would invoke code which throws an assert at runtime

这将使我能够强制执行我试图为我的团队制定的某些风格准则。

【问题讨论】:

  • 首先obj是函数名,不是对象。
  • err 我不认为“空格”是一个运算符,它是解析器对事物进行标记的一种方式,充其量。
  • 空间不是运算符。使用实际的静态代码分析,而不是复杂的运算符重载。
  • 这个问题在几个层面上都令人恐惧。最起码的是,声称有一点 C++ 经验(含糊不清,但似乎包括有关运算符重载的知识)的人不知道空格完全无关紧要,即使假设它是一个运算符。
  • 即使空间运算符存在,在运行时执行编码准则也只是自找麻烦。在这种情况下,如果不遵循编码准则,用户将遇到运行时崩溃。

标签: c++ operator-overloading c++11


【解决方案1】:

Bjarne Stroustrup 确实曾建议allowing overloading of whitespaces [PDF]。但鉴于这篇文章发表于 4 月 1 日st,他可能还没有 100% 认真......

这篇文章值得一读。

【讨论】:

【解决方案2】:

我建议您看看 Guy Steele 的新 HPC 语言:Fortress。它允许重载 并置 运算符。还有一篇关于这方面的博文here。它不会帮助您进行格式化,但它相当时髦。 (Haskell 和 ML 也使用并置来应用函数)。

【讨论】:

    【解决方案3】:

    如果您想强制执行样式准则,请获取可以识别样式违规的工具或应用程序。可以做到这一点的工具是 Klocwork。那里可能有更小更简单的工具。

    最坏的情况,自己写。

    【讨论】:

      【解决方案4】:

      C++ 中没有空格运算符。在大多数情况下,空格并不重要,从解析的角度来看,两者之间没有区别

      a-b
      

      a -      b

      我很高兴。

      注意:在我看来,有一些极端情况(嵌套模板会浮现在脑海中)它实际上很重要,但在我看来,这更像是语法的产物,而不是空格作为“运算符”处于活动状态的迹象。

      【讨论】:

      • 现在,为了迂腐,让事情稍微复杂一些,有时是否有空格(1 个或多个,那个 无关紧要)还是很重要的。正是每次缺少空格都会允许(贪婪的)标记器以不同的方式标记。最明显的例子是变量名(名字中不能有空格),但它也可能破坏例如preincrememt(+ + x 只是 x 并且没有副作用,++x 是 preincrement)。
      • 再次变得迂腐 ;) 这是分词器工作方式的结果,但为了使它们保持简单和可预测,这是必要的邪恶(只需尽可能多地匹配和匹配 - 而不是尝试找出可能的解释)。是的,它不会在标记化后为空格分配任何意义,更不用说使其成为运算符了。
      • 再举一个例子,预处理器通过宏名和括号之间的空格来区分函数样式的宏和以( 作为第一个替换字符的宏。 #define fn( x ) 接受参数,#define fn ( x ) 不接受。
      【解决方案5】:

      抱歉,不可能。

      改为查看代码格式化程序 - 每个流行的 IDE 都有一些(例如 eclipse 的 checkstyle),或者您可以在版本控制系统服务器中设置预提交挂钩,检查格式化前后的代码是否是相同,如果不是,则返回错误,而不是允许提交代码。

      【讨论】:

        【解决方案6】:

        这是不可能的。空间不是运算符。如果您想强制执行样式,请使用静态代码分析工具并与您的团队成员交谈。试试 cpplint 或类似的东西。

        【讨论】:

          【解决方案7】:

          没有像空白运算符这样的项目。一般来说,在 C++ 中,空格是无关紧要的,不会导致程序中的功能差异,因此没有什么可重载的。

          您正在寻找的是 C++ 的静态分析工具。类似于 C++ 的 StyleCop。不幸的是,我在这方面没有很多经验,不能推荐特定的程序。很可能这个线程上的其他人将能够做到。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-15
            • 2015-03-07
            • 2016-06-16
            相关资源
            最近更新 更多