C++双向运算符,这是可能的吗

C++ two-way operators, is it possible?

本文关键字:运算符 C++      更新时间:2023-10-16

例如,我们有这样的类:

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
}

有可能只做一个操作员*来做这两个操作员做的事情吗?

谢谢!

您不能这样做。然而,您可以实现一个,并简单地从另一个调用它:

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;
}

(请注意,不能将后一个函数作为类的一部分来实现。必须在外部实现。第一个函数可以作为实例方法来实现,因为它的第一个参数是类类型的。)

您可以通过使用另一个来实现一个:

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;
    }
    // ...
};

在本例中,您再次只实现一个操作,其余操作使用公共模式生成。