我在我的项目中使用两个不同的库,它们都提供一个基本的矩形 struct. 。问题在于,似乎无法在类型之间插入转换,因此我无法使用另一个库中函数的结果来调用一个库中的函数。如果我是其中任何一个的作者,我可以从外部创建转换,但我不能。

库一:

typedef struct rectangle { sint16 x; sint16 y; uint16 w; uint16 h; } rectangle;

库b:

class Rect {
  int x; int y; int width; int height;
  /* ... */
};

现在,我无法制作转换器 class, ,因为 C++ 只会在一步中查找转换。这可能是一件好事,因为有很多可能性涉及创建各种类型的新对象。

我无法创建一个可以接受的运算符 structa 并提供一个对象 classb:

foo.cpp:123 error: ‘operator b::Rect(const rectangle&)’ must be a nonstatic member function

那么,有没有一种明智的方法可以解决这个问题呢?

编辑:

我也许还应该指出,我真的很喜欢一些可以无缝处理结果的解决方案,因为我不希望成为那个编码员。(尽管我同意,老派的、明确的、转换将是一个不错的选择。另一个分支, reinterpret_cast 有同样的问题..)

编辑2:

事实上,这些建议都没有真正回答我的实际问题, 康拉德·鲁道夫 似乎是正确的。C++实际上做不到这一点。很糟糕,但确实如此。(如果有什么区别,我将尝试按照建议进行子类化 编码轮.

有帮助吗?

解决方案

如果您无法修改结构,那么您就别无选择,只能编写手动转换函数,因为重载转换运算符只能在类体内起作用。没有其他办法了。

其他提示

创建中间垫片类型“RectangleEx",并定义与第 3 方字符串类型之间的自定义转换。每当您使用任一 API 时,请通过 shim 类进行操作。

另一种方法是导出 class 从任一 rect 或者 Rectangle, ,并在那里插入转换/构造函数。

不确定这有多明智,但是这样的事情怎么样:

class R
{
public:
    R(const rectangle& r) { ... };
    R(const Rect& r) { ... };

    operator rectangle() const { return ...; }
    operator Rect() const { return ...; }

private:
    ...
};

然后你就可以把每一个包裹起来 rectangleR() “正确的事情”将会发生。

对于您的情况来说,这可能不可行,但我见过人们使用一些预处理器 foo 来调整类型以使其兼容。

即使这样,也假设您正在构建一个或两个库。

也有可能您根本不想这样做,但想重新评估一些早期的决定。或不。

为什么不做一些像这样简单的事情:(注意这可能/可能不会编译)但你明白了......


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;

}

编辑: 看来我和koko的想法是一样的。

如果 struct内部是相同的,你可以做一个 reinterpret_cast;但是,由于看起来您有 16 位字段与 32 位字段,因此您可能会在每次调用时进行转换,或者为其中一个库的所有函数编写包装器。

也许你可以尝试使用运算符重载?(也许 = 运算符不是您的类的方法)?

矩形运算符=(常量矩形&,常量矩形&)

有关此内容的更多信息,请参见 Bjarne Stroustrup 的 C++ 编程语言,或者可能在此页面上: http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top