是否可以在结构外部编写自动转换运算符
Is it possible to write auto-cast operator outside a struct?
具体情况如下:我已经在系统API中定义了结构CGPoint
和CGSize
,我希望能够编写my_point = my_size
。我不能修改CGPoint
结构,只能写外部运算符。我可以编写二进制运算符(+
、-
…),但必须在结构内部声明operator=
。那么,还有其他解决方案吗?
要编译表达式a = b;
,您需要具有a
类型的operator=
,该CCD_9接受b
类型的元素,或者具有从b
隐式转换的类型。
排除了第一种情况,因为operator=
必须是类的成员,并且由于不能修改GLPoint
,所以不能添加GLPoint& GLPoint::operator=( GLSize )
。
第二个案例也存在同样的问题。从GLSize
到GLPoint
的隐式转换可以在GLPoint
中实现为隐式构造函数(排除),也可以在CCD20中实现为成员operator GLPoint()
,这需要修改GLSize
。转换也不能作为自由函数添加。
替代方案是使用非运算符语法,如添加自由函数assign
(或copy
):GLPoint& assign( GLPoint&, GLSize const & )
。
下一个问题是你为什么要这样做。如果GLPoint
和GLSize
的设计者没有考虑到一个大小应该可以分配给一个点,那么你为什么觉得它们应该是可以分配的呢?一般来说,将类型分开是个好主意,因为这将使编译器能够检测您在代码中可能犯的错误。
如果您允许从GLSize
到GLPoint
的隐式转换,您可能会错误地键入以下内容:distance( point1, size2 )
,您的意思是distance( point1, point2 )
,因为有转换,编译器会很乐意转换并应用。然后,您将看到奇怪的结果,并且您将花费相当多的nice调试时间来尝试确定逻辑错误的位置。
除非域对每个运算符在该上下文中的含义有一个非常明确的定义,否则我将不惜一切代价避免运算符过载。阅读您的代码的每个都会立即理解GLPoint(1,2) + GLSize(5)
所代表的内容吗?如果不是这样,如果人们会感到惊讶甚至怀疑,那么请避免运算符重载,并使用命名函数:move_up( GLPoint&, GLSize )
(或任何点+大小对您来说意味着什么)
当您将CGSize
分配给CGPoint
时,会发生什么?把它分散到一些运营商那里,你就有了它——例如
CGPoint& operator|=(CGPoint& cPoint, CGSize const& cSize)
{
// now set attributes of cPoint that you can extract from cSize
return cPoint;
}
这有什么困难?以下是一个示例:http://www.ideone.com/FZN20
如果您可以从CGPoint派生或包装CGPoint,并在整个代码中使用新类,那么您可以提供任何您喜欢的运算符。新类可以具有到CGPoint
的转换运算符,以便于与现有函数进行交互。
其他答案遗漏了显而易见的解决方案:添加一个函数将CGPoint转换为CGSize。当然,这并不是你想要的(size = point
),但由于你不能修改两个类中的任何一个,这是唯一的方法:
CGSize ToSize( const CGPoint &pt )
{
CGSize res = ...
// do the conversion
return res;
}
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 构造函数和转换运算符之间的重载解析
- 分配给转换运算符失败-C++
- 转换运算符不适用于sleep_until
- 继承模板化转换运算符
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 如何在模板化转换运算符中消除此构造的歧义?
- 为什么选择转换运算符的重载?
- 如何避免强制转换运算符 () 和访问运算符 [] 冲突?
- 如果可能的话,C++总是更喜欢右值引用转换运算符而不是常量左值引用吗?
- 了解转换运算符的选择C++
- 多个隐式转换运算符
- 这个typedef和转换运算符语法是什么意思
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 类模板忽略了用户定义的转换运算符(非模板不忽略)
- 为什么在std::for_each()返回时调用转换运算符
- 为什么 std::optional 的强制转换运算符被忽略了
- 使用用户定义的转换运算符推导函数模板参数
- 模板转换运算符的分辨率不明确
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?