Как уже упоминалось, оператор %
является бинарным оператором, поэтому переназначить его как унарный модуль невозможно.
Сказав, что мы можем злоупотреблять бинарным оператором свободной функции, чтобы обеспечить синтаксический сахар.
Примечание Этот ответ для развлечения и в духе обучения.Это не рекомендация стиля кодирования.
#include <cmath>
struct imperative_mode_sentinel {};
struct complex
{
complex(double rm, double im) : rm(rm), im(im) {}
double rm, im;
complex modulus() const
{
return complex(std::pow(rm, 2), std::pow(im, 2));
}
};
auto operator%(imperative_mode_sentinel, complex const& r) -> complex
{
return r.modulus();
}
constexpr static auto imperative_mode = imperative_mode_sentinel();
int main()
{
auto c = complex(1,1);
auto d = imperative_mode %c; // equivalent to d = c.modulus()
}