如何定义运算符**
,使其可以执行2个数的取幂。例如2 ** 3
。应该给出答案为8。
或间接有任何方法可以通过运算符重载代替#define
宏来实现这一点吗?
答案 0 :(得分:19)
你做不到。您只能重载现有的运算符,而不是内置类型。
答案 1 :(得分:9)
你做不到。您只能在C ++中重载现有的运算符;你不能添加新的,或改变现有运营商的arity或关联性。即使预处理器在这里也无能为力 - 它的标识符不能是符号。
答案 2 :(得分:5)
如果您愿意做出妥协,请与他人联系。 **
并且感觉像是在混淆代码:
#include <cmath>
#include <iostream>
struct foo {
foo(int i) : i_(i) {}
int operator*(int exp)
{
return std::pow(i_,exp);
}
private:
int i_;
};
struct bar {
} power_of;
foo operator*(int i, bar)
{
return foo{i};
}
int main()
{
std::cout << 2 *power_of* 3; // prints 8
}
否则,只需使用std::pow
。
答案 3 :(得分:5)
与其他提到的答案一样,内置类型 BUT 是不可能的,您可以将其用于自定义类型(最小代码示例):
#include <cmath>
#include <iostream>
struct dummy;
struct Int
{
int i;
Int() : i(0) {}
Int(const int& i) : i(i) {}
dummy operator*();
};
struct dummy
{
Int* p;
dummy(Int* const p) : p(p) {}
int& operator*()
{
return p->i;
}
};
dummy Int::operator*()
{
return dummy(this);
}
int operator*(const Int& lhs, const dummy& rhs)
{
return std::pow(lhs.i, rhs.p->i);
}
int main()
{
Int a(2);
Int b(2);
std::cout<< a ** b << std::endl;
}
答案 4 :(得分:3)
正如其他人已经注意到的那样:这是不可能的。您可以重载其他运算符(如^
)以进行取幂,而不是在简单类型的包装类/对象上。
但是,如果你喜欢冒险,另一种方法是创建一个微型DSL,支持这种运营商的即时计算。 (A famous example of that is LISP in C++)
然而,考虑到所涉及的努力,它可能是也可能不是你的一杯茶。但是,值得知道存在这种可能性。
更新:
运算符重载通过重载已经存在的运算符来实现。 为什么?因为如果您可以定义自己的,那么您还必须定义这些运算符的优先级,这些运算符可以通过抽象掉它们的原始目的轻易让位于滥用运算符 - 这会增加阅读代码时的难度。 (至少那是已经提出的论点)。
具有接近**
的语义含义的最接近的运算符是插入符号运算符。这种运算符的简单和说明性实现是:
#include <iostream>
#include <cmath>
class Int {
public:
Int() {}
Int(int i) : value(i) {}
friend double operator^(const int& i, const Int& integer);
friend double operator^(const Int& integer, const int& i);
friend double operator^(const Int& lhs, const Int& rhs);
private:
int value;
};
double operator^ (const int& lhs, const Int& rhs) {
return std::pow(lhs, rhs.value);
}
double operator^ (const Int& lhs, const int& rhs) {
return std::pow(lhs.value, rhs);
}
double operator^ (const Int& lhs, const Int& rhs) {
return std::pow(lhs.value, rhs.value);
}
int main() {
Int i1 = 10;
Int i2 = 3;
double result = i1 ^ i2;
std::cout << result;
return 0;
}
答案 5 :(得分:0)
您不能为内置类型重载运算符。我会将operator ^
用于自定义类型。
答案 6 :(得分:0)
不幸的是,可以在C ++中重载的运算符集是固定的,不包括**运算符。您可能会考虑使用operator^()
,但事实证明^具有错误的优先级来充当取幂运算符。
简而言之,不幸的是,你无能为力。