是否可以使用任意字符作为运算符?
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;
}
请注意,您不能影响这些命名运算符的优先级:它们将具有与 <
、<=
、>
和 >=
相同的优先级。如果您需要不同的优先级,则必须使用不同的定界符(这可能不太可读)。
免责声明
上面的技巧是"clever"代码,它几乎是对C++语法的滥用。我把这个问题当作一个假设 "what is possible," 并用同样假设的 "this is." 回答 我会 不 建议在实践中使用它来处理诸如替换 [=18 这样的琐碎问题=] 或为此提供 "novelty" 语法。上面提到的运算符优先级警告是一个原因;构造的普遍不熟悉是另一个。代码质量以代码生成的 WTF 数量来衡量(越少越好),而这个技巧会生成一大堆 WTF(而且是大的)。
它仍然有它的用途:用于创建特定领域的语言。在编程中存在将 DSL 嵌入到 C++ 代码中的情况;在这种情况下(在这种情况下只有)我会考虑使用这个。
如前所述:这不是我要'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;
}
请注意,您不能影响这些命名运算符的优先级:它们将具有与 <
、<=
、>
和 >=
相同的优先级。如果您需要不同的优先级,则必须使用不同的定界符(这可能不太可读)。
免责声明
上面的技巧是"clever"代码,它几乎是对C++语法的滥用。我把这个问题当作一个假设 "what is possible," 并用同样假设的 "this is." 回答 我会 不 建议在实践中使用它来处理诸如替换 [=18 这样的琐碎问题=] 或为此提供 "novelty" 语法。上面提到的运算符优先级警告是一个原因;构造的普遍不熟悉是另一个。代码质量以代码生成的 WTF 数量来衡量(越少越好),而这个技巧会生成一大堆 WTF(而且是大的)。
它仍然有它的用途:用于创建特定领域的语言。在编程中存在将 DSL 嵌入到 C++ 代码中的情况;在这种情况下(在这种情况下只有)我会考虑使用这个。