【问题标题】:How to implement conversion between two third party types?如何实现两种第三方类型之间的转换?
【发布时间】:2018-03-09 16:00:58
【问题描述】:

我在我的 C++ 项目(Qt、cocos2d)中使用了两个独立的第三方库。两者都定义了自己的 2d 和 3d 向量版本。如何实现自定义隐式(或显式)转换方法,这样我就不必像这样显式创建新实例:

// mousePosition is of type QPointF
auto position = cocos2d::Vec2(mousePosition.x(), mousePosition.y()) 

当然,我不能真正修改这两个库的源代码。在 Obj-C 或 C# 中,我可以使用类扩展。我不确定C++。有没有比普通的全局函数更好的解决方案?

【问题讨论】:

  • 您可以创建自己的自定义向量类型,其中包括将返回正确类型的转换运算符(基于您分配的内容)
  • 有一篇关于自定义转换的好文章:en.cppreference.com/w/cpp/language/cast_operator
  • 你可以写一个函数来封装内部细节。您可以通过参数重载该函数,以免污染命名空间。
  • 正如@UnholySheep 建议的那样,您可以实现自己的中间类,并通过您的中间类拥有隐式转换方法。或者,您的中间体可以是一个轻量级的所有者包装器,围绕它首先看到的任何一个,使用转换方法,因此当您不需要它时,您无需为转换付费。对于有限的维度,可能不值得。

标签: c++ c++11 casting type-conversion


【解决方案1】:

没有办法在不改变其中任何一个的情况下实现两种类型之间的隐式转换。这可以机械地解释:这种转换必须是构造函数或转换运算符,两者都必须是成员。

更有启发性的解释是,这种隐式转换可能会破坏类型的现有使用(例如,通过引入歧义)。使用模板,在定义模板后引入额外的重载(或者,在这种假设情况下,使其更可行)很容易成为未定义的行为。

所以你的转换必须是显式的,然后是微不足道的:定义

B convert(const A&);
A convert(const B&);

根据需要提供尽可能多的A-B 对;方便的是,它们甚至不需要有不同的名称,因为假设它们之间没有隐式转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    相关资源
    最近更新 更多