gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:52:14 24 4
gpt4 key购买 nike

如前所述:这不是我“渴望”实现的目标;更多关于它是否真的可能的问题。

注意我了解(并使用过)C++ 中的运算符重载。例如:

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

是否可以定义一个自定义的 ASCII 字符作为操作符?

例如,简单来说:使用 重音 (`) 作为 std::pow 的“别名”。

因此,以下陈述将是有效/可实现的:

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

>> 8

最佳答案

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

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]

请注意,您不能影响这些命名运算符的优先级:它们的优先级与 < 相同。 , <= , > , 和 >= .如果您需要不同的优先级,则必须使用不同的分隔符(这可能不太容易阅读)。


免责声明

上面的技巧是“聪明”的代码,它几乎是对 C++ 语法的滥用。我把这个问题当作一个假设的“什么是可能的”,并用同样假设的“这是”来回答。我建议在实践中使用它来解决诸如替换 std::pow 之类的琐碎问题。或为此提供“新颖”的语法。上面提到的运算符优先级警告是一个原因;结构的一般不熟悉是另一个。代码质量是通过代码生成的 WTF 数量来衡量的(越少越好),而这个技巧会生成一大堆(而且是大的)。

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

关于c++ - 是否可以使用任意字符作为运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28850432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com