如何在C ++中转换类型?

时间:2020-03-05 18:43:20  来源:igfitidea点击:

我在项目中使用了两个不同的库,它们都提供了一个基本的矩形" 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()中,就会发生"正确的事情"。