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

时间:2012-02-21 13:20:09

标签: c++ g++ operator-overloading

我有一个名为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)'

我可以吃蛋糕吗?

2 个答案:

答案 0 :(得分:6)

按照惯例,你需要一个强大的typedef。其中一个实现是BOOST_STRONG_TYPEDEF

答案 1 :(得分:4)

正如@ Cat ++所说,BOOST_STRONG_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完全不同的数据类型。然而,由于int函数,您可以为其分配operator =个值,并因其intoperator const original_type&() const函数将其值检索为operator original_type&()

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

我的个人推荐:尽可能使用提升。