我有一个名为MyType
的类型int
:
typedef int MyType;
在整个代码中,它被视为int
。
我希望能够为int
和MyType
分别重载运算符:
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)'
我可以吃蛋糕吗?
答案 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 =
个值,并因其int
和operator const original_type&() const
函数将其值检索为operator original_type&()
。
这大致是它的BOOST_STRONG_TYPEDEF
宏所做的提升,但它似乎是继承自其他内部类,我不确定这些类的作用。但对于那些不想出于任何理由依赖提升的人来说,这是一个粗略的解决方案。
我的个人推荐:尽可能使用提升。