例如,我们有这个类:
class my_class
{
public:
friend my_class operator* (const my_class&, int a);
friend my_class operator* (int a, my_class&);
};
my_class operator* (int a, my_class&)
{
// do my_class * a
}
my_class operator* (int a, my_class&)
{
// do a * my_class
}
是否可以只做一个操作员*来做这两个操作?
谢谢!
答案 0 :(得分:6)
你做不到。但是,您可以实现一个,只需从另一个调用它:
my_class operator *(const my_class &l, int r) {
// implement the actual operator here.
}
my_class operator *(int l, const my_class &r) {
return r * l;
}
(请注意,您不能将后一个函数作为类的一部分实现。您必须在外部执行。第一个函数可以作为实例方法实现,因为它的第一个参数是类类型。)
答案 1 :(得分:1)
您可以使用另一个来实现:
my_class operator*(int lhs, const my_class& rhs)
{
return rhs * lhs;
}
如果操作本身是可交换。情况并非总是如此,所以要小心。
还有一些库可以帮助您使用某些操作员。如果你有
my_class mc, a, b;
a = mc * 1;
b = 1 * mc;
您可能也希望能够执行类似
的操作mc *= 1;
在这种情况下,您只需实施
my_class& my_class::operator*=( int v );
您可以使用Boost.Operators或df.operators自动生成其他运算符。
示例:
struct my_class
: df::commutative_multipliable< my_class, int >
{
// ...
my_class& operator*=( int v )
{
// ... implement me!
return this;
}
// ...
};
在此示例中,您再次仅实现一个操作,其余操作使用通用模式生成。