C ++双向运算符,有可能吗?

时间:2014-11-10 21:25:48

标签: c++ operator-overloading overloading

例如,我们有这个类:

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
}

是否可以只做一个操作员*来做这两个操作?

谢谢!

2 个答案:

答案 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.Operatorsdf.operators自动生成其他运算符。

示例:

struct my_class
    : df::commutative_multipliable< my_class, int >
{
    // ...

    my_class& operator*=( int v )
    {
        // ... implement me!
        return this;
    }

    // ...
};

在此示例中,您再次仅实现一个操作,其余操作使用通用模式生成。