如何在C ++中转换类型?
我在项目中使用了两个不同的库,它们都提供了一个基本的矩形" struct"。这样做的问题是,似乎没有办法在类型之间插入转换,因此我不能在一个库中调用函数,而将另一个函数的结果调用。如果我是这两种方法的作者,那么我可以从外部创建转换,但是我不能。
库a:
typedef struct rectangle { sint16 x; sint16 y; uint16 w; uint16 h; } rectangle;
库b:
class Rect { int x; int y; int width; int height; /* ... */ };
现在,我无法创建转换器"类",因为C ++只会一步一步地寻找转换。这可能是一件好事,因为创建各种类型的新对象会涉及很多可能性。
我不能让一个运算符从a取走struct并从b取一个class的对象:
foo.cpp:123 error: ‘operator b::Rect(const rectangle&)’ must be a nonstatic member function
那么,有没有解决这个问题的明智方法呢?
编辑:
我也许还应该指出,我真的很想要一些可以无缝处理结果的解决方案,因为我不希望自己成为那个编码器。 (尽管我同意,老式的,明确的转换将是一个不错的选择。另一个分支" reinterpret_cast"也存在相同的问题。)
编辑2:
实际上,所有建议都无法真正回答我的实际问题,康拉德·鲁道夫(Konrad Rudolph)似乎是正确的。 C ++实际上无法做到这一点。糟透了,但事实如此。 (如果有什么不同,我将尝试按照CodingTheWheel的建议进行子类化。
解决方案
回答
在情况下,这可能不可行,但是我已经看到人们使用一些预处理器-foo来使类型兼容。
即使这样,也假设我们正在构建一个或者两个库。
我们也可能根本不想这样做,但想重新评估一些早期决定。或者不。
回答
如果struct
在内部相同,则可以执行reinterpret_cast
;。但是,由于看起来我们有16位和32位字段,因此我们可能在每次调用时都进行转换,或者为其中一个库的所有功能编写包装器。
回答
为什么不这样简单:(请注意,这可能/可能不会编译),但是我们知道了...
private Rect* convert(const rectangle& src) { return new Rect(src.x,src.y,src.w,src.h); } int main() { rectangle r; r.x = 1; r.y = 2; r.w = 3; r.h = 4; Rect* foo = convert(&r); ... delete foo; }
编辑:看起来像科科的和我有相同的想法。
回答
也许我们可以尝试使用运算符重载进行尝试? (也许是=运算符,它不是类的方法)?
矩形运算符=(const Rect&,const矩形&)
有关Bjarne Stroustrup的C ++编程语言的更多信息,或者在以下页面上:http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html
回答
创建一个中间垫片类型"RectangleEx
",并定义到/自第三方字符串类型的自定义转换。每当我们使用这两个API进行交谈时,都可以通过shim类进行操作。
另一种方法是从" rect"或者" Rectangle"派生" class",然后在其中插入转换/构造函数。
回答
如果我们不能修改结构,那么我们除了编写手动转换函数外别无选择,因为重载转换运算符仅在类体内起作用。没有别的办法了。
回答
不知道这有多明智,但是像这样的事情如何:
class R { public: R(const rectangle& r) { ... }; R(const Rect& r) { ... }; operator rectangle() const { return ...; } operator Rect() const { return ...; } private: ... };
然后,我们只需将每个rectangle
包装在R()
中,就会发生"正确的事情"。