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;
}
残念ながら、この累乗演算子の優先順位と結合性は間違っています。私の質問は次のとおりです。これを修正するにはどうすればよいですか?数学表記のように、 my<pow>
をより優先して右に関連付けたいと思います。*
編集異なる括弧を使用して優先順位を変えること|op|
は/op/
可能*op*
です<<--op-->>
。しかし、今日の C++ はテンプレート メタプログラミングと型推論で非常に強力であるため、目的の結果を達成するには別の方法が必要です。
pow
さらに、 and notを使用できればいいのにと思いますpwr
。残念ながら、一部の実装ではグローバル名前空間に#include <cmath>
持ち込むため、競合が発生します。フォームの宣言のようpow
にオーバーロードできますかoperator not
not using std::pow;
std::pow
グローバル名前空間から削除されましたか?
さらに読む: Bjarne Stroustrup による関連する提案。