您如何看待在C ++中指定用户定义的运算符的虚构可能性。
这样的用户定义的运算符可以通过运算符名称(允许的字符的任意序列?),它的优先级,关联性和arity(其他东西?)来定义。
它们可用于多种用途:帮助构建基于C ++的“微小”DSL,用于列表理解等。
此功能不会扩展语言的可能用途吗?什么是允许用户定义的运营商的其他语言? Lisp浮现在脑海中,还有什么?有关该主题的任何链接?
答案 0 :(得分:7)
嗯,你知道,Bjarne Stroustrup提出了这样的建议...... Generalizing Overloading for C++2000。 :-P :-P :-P
答案 1 :(得分:4)
嗯,Haskell具有可设置优先级和左右绑定的自定义运算符。所以,它可以工作。但是,Haskell虽然主要是被一些相当聪明的人所使用,但它的前沿几乎没有可读性。 (Haskell吓跑了所有的新手,我想......)
对于C ++,我认为有:
std::vector<std::list<int>>
错误,其中>>
被解析为右移运算符.C ++的语法很难。后者是交易破坏者,IMO。
然而,没有什么能阻止你编写一个c ++ - 预处理器/解析器,用真正的函数调用替换你自己定义的运算符,然后使用普通的c ++编译器(就像之前的c ++是如何构建的)。如果你保持足够的理智去运输,那将是一个很好的实验。 ; - )
答案 2 :(得分:1)
我无法理解这些运营商的优势。功能和方法足以满足我能想到的各种用途。
我认为这样的可能性只会使C ++变得更复杂并降低源的可读性。在某些来源中,操作员压倒一切已经是如此混乱,我无法想象有些人会对操作员的定义做些什么......
顺便说一句,我真的不明白你的意思是“基于C ++的小型DNS”答案 3 :(得分:1)
因此,假设您将**定义为“作为用户操作员的权力”。
现在你有了这样的代码:
double d1 = 2.5;
double *pd1 = &d1;
double d2 = 3.0**pd1;
如果没有“operator **”,上面的代码实际上是合法的,它被解析为3.0 * (*pd1)
(结果是7.5)
编译器是否会知道**是否如上所述或尝试执行“power”(并抱怨右侧是指针)。
说过我确实认为&&=
和||=
甚至^^
和^^=
都应该添加为运算符。 (我不认为^^是逻辑xor,如果其中一个表达式非零,则给出一个真值。)
答案 4 :(得分:0)
您可能正在混合概念 - 用户定义的运算符重载是可以的。这是因为编译器已经知道C ++定义的运算符的语法规则。
用户定义的操作符“本身” - 没有。想象一下,能够将“Klingon”这个词变成一个运算符 - 它如何区分运算符和变量?