C++:重载类似整数类型的运算符

C++: Overloading operators for similar integer types

本文关键字:类型 运算符 整数 重载 C++      更新时间:2023-10-16

我有一个名为MyType的类型,它是int:

typedef int MyType;

在整个代码中,它被视为int

我希望能够分别为intMyType:过载操作员

class C
{
public:
   C& operator>>(int i) {}
   C& operator>>(MyType i) {}
};

但我不能:

overload.cpp:7:7: error: 'C& C::operator>>(MyType)' cannot be overloaded
overload.cpp:6:7: error: with 'C& C::operator>>(int)'

我可以吃我的蛋糕吗?

和往常一样,您需要一个强typedef。其中一个实现是BOOST_STRONG_TYPEDEF

正如@Cat++所说,BOOstrongTRONG_TYPEDEF是一个很好的解决方案。然而,对于那些不想依赖boost库的人(如果你这样做的话,没有错),这样做更容易:

#define TYPEDEF(original_type,target_type)struct target_type{
    original_type value;
    explicit target_type(const original_type val):value(val){}
    target_type(){}
    target_type(const target_type& other):value(other.value){}
    target_type& operator=(const original_type& rhs){value = rhs; return *this;}
    target_type& operator=(const target_type& rhs){value = rhs.value; return *this;}
    bool operator==(const target_type& rhs){return value == rhs.value;}
    bool operator<(const target_type& rhs){return value < rhs.value;}
    operator const original_type&() const{return value;}
    operator original_type&(){return value;}
}

用法:TYPEDEF(int, MyType);

那么这个宏做什么
这个宏基本上创建了一个新的结构,可以通过多种方式轻松地将其视为原始类型。对于编译器来说,这是一种完全不同的类型。

以您的MyType为例。当您将其声明为typedef int MyType;时,在编译时,MyType将被int替换。由于您已经定义了一个以int为参数的函数,它会抱怨函数体重复。

当您执行TYPEDEF(int, MyType);时,MyType是一个可以初始化并分配int类型值的结构,编译器会将其视为与int完全不同的数据类型。然而,由于operator =函数,您将能够为其分配int值,并且由于其operator const original_type&() constoperator original_type&()函数,您可以将其值检索为int

这大致是boost对其BOOST_STRONG_TYPEDEF宏的作用,但它似乎继承了其他内部类,我不确定这些类的作用。但对于那些出于任何原因不想依赖提振的人来说,这是一个粗略的解决方案。

我的个人建议:尽可能使用boost。