C++:重载类似整数类型的运算符
C++: Overloading operators for similar integer types
我有一个名为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)'
我可以吃我的蛋糕吗?
和往常一样,您需要一个强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&() const
和operator original_type&()
函数,您可以将其值检索为int
。
这大致是boost对其BOOST_STRONG_TYPEDEF
宏的作用,但它似乎继承了其他内部类,我不确定这些类的作用。但对于那些出于任何原因不想依赖提振的人来说,这是一个粗略的解决方案。
我的个人建议:尽可能使用boost。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- JS相等运算符(如===)是否可以使用embind类型
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 将所有模板类型传递给运算符,而不指定所有类型
- 标准库类型的赋值运算符的引用限定符
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 如何确保接受的C++模板类型使运算符重载?
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- C2679 二进制"<<":未找到采用右操作数类型的运算符
- 使用类型id运算符的最佳替代方法
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- int* 和 int[] 类型对二进制运算符 + 的操作数无效
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 运算符'<'不能应用于类型 'string' 和 'string' 的操作数
- 为什么重载运算符可以返回其返回类型以外的其他内容?
- 表达式必须具有类类型(运算符)
- 使用许多类型运算符过载时,模棱两可的超载
- 类型转换为类型&&运算符
- 返回类型 ?:运算符和 C++ Primer 中的措辞
- 返回类型与返回类型(运算符++)不相同,也不协变