C++ 在C+中实现混合模式算术运算符重载的正确方法+;

C++ 在C+中实现混合模式算术运算符重载的正确方法+;,c++,operator-overloading,C++,Operator Overloading,假设我有一些用户定义的类型T,它应该支持混合模式算法,比如T+2、15+T和T+T 我可以定义运算符+以接受不同类型的操作数: T operator+(T a, T b) { return a += b; // assume that operator += is implemented as a member function of T } T operator+(T a, int b) { // implementation } T operator+(int a, T

假设我有一些用户定义的类型T,它应该支持混合模式算法,比如T+2、15+T和T+T

我可以定义运算符+以接受不同类型的操作数:

T operator+(T a, T b) {
    return a += b;  // assume that operator += is implemented as a member function of T
}

T operator+(T a, int b) {
    // implementation
}

T operator+(int a, T b) {
    // implementation
}
如果类型T预计支持与许多其他类型(int、double、string等)的算术运算,则T和这些类型的组合数量及其位置(T、string/string、T)将相当高


我的问题是,是否有更优雅的方法来重载运算符以减少此类组合的数量。

这取决于您的用例

很多时候,您可以通过编写

T(int i) {
    //construct T from int
};
不要把它标记为明确的。现在您可以通过定义

T operator+(T a, T b)
因为隐式转换将启动将
int
转换为
T
。如果您需要许多不同的算术类型,您可以多次使用一个模板构造函数

template <typename U, std::enable_if_t<std::is_arithmetic_v<U>, int> = 0>
T(U u) {
    //construct T from arithmetic type
};
模板
T(U){
//从算术类型构造T
};
现在,相同的
操作符+
将处理所有内置数字

另一个选项是给
T
一个转换运算符,将其转换为
int
,但由于您询问的是返回
T
运算符+
,因此我将跳过该示例。原理相同,但添加后会得到
int
s


如果您的
T
非常复杂,有时您只需要为它提供许多不同的运算符重载。

您只需实现
T运算符+(const T&,const T&)
函数,并确保为
T
提供适当的构造函数,这些构造函数可以采用您希望添加的其他类型即可。在查找函数时,编译器最多允许对每个参数进行一次转换,这些构造函数将提供转换。但是,如果您有类型
G
H
,并且您希望一个概念将它们相加以创建一个新的
G
,另一个概念创建一个新的
H
。所以要小心,谢谢你的回答。也许这是最简单的方法,因为我有合适的构造函数从int和string创建T。谢谢你的详细回答。实际上,类型T代表了一个非常大的数字,在这个类型中它被存储为字符串。T可以由int或string构造,我需要实现所有的比较和算术运算符,而不仅仅是+。但我认为在这种情况下,使用未标记为显式的构造函数的方法就足够了。