是否可以使用任意字符作为运算符?

Is it possible to use an arbitrary character as an operator?

如前所述:这不是我要'desire'实现的目标;更重要的是,一个与它是否真的可能相关的问题。

N.B. 我了解(并使用过)C++ 中的运算符覆盖。例如:

std::ostream& operator<<(std::ostream& os, const T& obj){ return os; }

是否可以定义自定义 ASCII 字符作为运算符?

例如,在简单意义上:使用重音符 (`) 作为'alias' for std::pow.

因此,以下语句将是 valid/achievable:

std::cout << 2`3 << std::endl;

>> 8

不,那是不可能的。即使在预处理器级别,您也会受到构成有效预处理器标记和宏名称的字符的限制,然后语言语法会修复语言中的运算符集。

您不能引入语法中不存在的字符,例如您提到的反引号。但是有一个"named operator" trick,你可以用它引入一个"named operator"来实现下面的语法:

std::cout << (2 <Pow> 3) << std::endl;

技巧依赖于为自定义类型重载 <>,如下所示:

const struct PowOperator {} Pow;

struct PowInvoker
{
  int lhs;
};

PowInvoker operator< (int lhs, PowOperator)
{
  return {lhs};
}

int operator> (PowInvoker lhs, int rhs)
{
  return std::pow(lhs.lhs, rhs);
}

int main()
{
  std::cout << (2 <Pow> 3) << std::endl;
}

[Live example]

请注意,您不能影响这些命名运算符的优先级:它们将具有与 <<=>>= 相同的优先级。如果您需要不同的优先级,则必须使用不同的定界符(这可能不太可读)。


免责声明

上面的技巧是"clever"代码,它几乎是对C++语法的滥用。我把这个问题当作一个假设 "what is possible," 并用同样假设的 "this is." 回答 我会 建议在实践中使用它来处理诸如替换 [=18 这样的琐碎问题=] 或为此提供 "novelty" 语法。上面提到的运算符优先级警告是一个原因;构造的普遍不熟悉是另一个。代码质量以代码生成的 WTF 数量来衡量(越少越好),而这个技巧会生成一大堆 WTF(而且是大的)。

它仍然有它的用途:用于创建特定领域的语言。在编程中存在将 DSL 嵌入到 C++ 代码中的情况;在这种情况下(在这种情况下只有)我会考虑使用这个。