在C++中,引入新的中缀运算符非常简单
// User-defined infix operator framework
template <typename LeftOperand, typename Operation>
struct LeftHelper
{
const LeftOperand& leftOperand;
const Operation& operation;
LeftHelper(const LeftOperand& leftOperand,
const Operation& operation)
: leftOperand(leftOperand), operation(operation) {}
};
template <typename LeftOperand, typename Operation >
auto operator < (const LeftOperand& leftOperand,
Operation& operation)
{
return LeftHelper<LeftOperand, Operation>(leftOperand, operation);
}
template <typename LeftOperand, typename Operation, typename RightOperand>
auto operator > (LeftHelper<LeftOperand, Operation> leftHelper,
const RightOperand& rightOperand)
{
return leftHelper.operation(leftHelper.leftOperand, rightOperand);
}
// Defining a new operator
#include <cmath>
static auto pwr = [](const auto& operand1, const auto& operand2) { return std::pow(operand1, operand2); };
// using it
#include <iostream>
int main()
{
std::cout << (2 <pwr> 16) << std::endl;
return 0;
}
不幸的是,这个幂运算符的优先级和结合性是错误的。所以我的问题是:如何修复这个问题? 我希望我的<pow>
比*
拥有更高的优先级,并向右结合,就像数学符号一样。
编辑 通过使用不同的括号,例如|op|
、/op/
、*op*
甚至,如果一个人愿意的话,<<--op-->>
可以改变优先级。但是这种方式无法超过最高内置操作符优先级。但是今天C++具有模板元编程和类型推断的强大功能,一定有其他方法可以实现所需的结果。
此外,如果我能使用pow
而不是pwr
,那就太好了。不幸的是,在某些实现中,#include <cmath>
会将pow
带入全局命名空间,从而产生冲突。我们能否重载not运算符
,使得声明形式为
not using std::pow;
从全局命名空间中删除了std::pow
?
更多阅读:Bjarne Stroustrup提出的相关建议。
while(i ----> 0)
。非常方便! - eerorika