交换重载算术运算符的参数

时间:2014-05-13 12:19:20

标签: c++

假设我定义了一个结构,并重载了产品运算符,以便我可以将对象与数字相乘。

struct myStruct
{
myStruct(int a): num(a) {}
int num;
};

myStruct operator*(myStruct A, int b)
{
A.num *= b;
return A;
}

有没有办法让程序理解我还希望能够在没有复制粘贴重载语句的情况下执行int * myStruct?

3 个答案:

答案 0 :(得分:2)

您可以使用Boost.Operators库。从boost::multipliable<myStruct, int>获取您的课程。然后,您只需要在班级中实施operator*=(int),Boost会自动为您提供operator*的两个方向的实施。

#include <boost/operators.hpp>

struct myStruct : boost::multipliable<myStruct, int>
{
    myStruct(int a): num(a) {}
    int num;

    myStruct &operator *=(int x) {
        num *= x;
        return *this;
    }
};

答案 1 :(得分:2)

不,你必须提供两种重载。但是你可以通过使用公共成员函数来摆脱代码重复。或者甚至更好,提供operator*=(感谢@dyp指出这一点)。

例如:

struct myStruct {
    myStruct(int a): num(a) {}
    int num;

    myStruct& operator*=(int b) {
        num *= b;
        return *this;
    }
};

// Now you have the minimal amount of code duplication in both overloads
myStruct operator*(myStruct A, int b) {
    return A *= b;
}

myStruct operator*(int a, myStruct B) {
    return B *= a;
}

注意:其他几位已经指出,您的班级myStruct目前通过非显式构造函数定义隐式转化。因此,如果您想保留此转换(我不建议这样做),您实际上可以为所有情况定义单个运算符:

myStruct operator*(myStruct a, myStruct b) {
    return a *= b;
}

答案 2 :(得分:0)

通常的计划是让+=成为会员,因为无论如何左边必须是你班级的对象;并使用+的免费功能,以便转化可以适用于双方。

struct myStruct
{
    myStruct(int a): num(a) {}
    int num;

    myStruct &operator+=(myStruct b) { num += b.num; return *this; }
};

myStruct operator+(myStruct a, myStruct b) { return a += b; }

您定义了转换构造函数,因此您无需提供每个运算符的副本。