代码之家  ›  专栏  ›  技术社区  ›  Anders Eurenius

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

  •  0
  • Anders Eurenius  · 技术社区  · 16 年前

    我在项目中使用了两个不同的库,它们都提供了一个基本的矩形 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;
      /* ... */
    };
    

    现在,我不能做一个转换器 class ,因为C++只会在一个步骤中寻找转换。这可能是件好事,因为有很多可能涉及到创建各种类型的新对象。

    我不能让接线员 结构 a 并提供 b :

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

    那么,有没有一个明智的方法来解决这个问题?

    编辑:

    我可能还应该指出,我真的希望有一些解决方案能够无缝地处理结果,因为我不希望自己是编码人员。(尽管我同意,老派的,明确的,转变将是一个不错的选择。另一个分支, reinterpret_cast 有同样的问题….)

    编辑2:

    实际上,这些建议都没有真正回答我的实际问题, Konrad Rudolph 似乎是正确的。C++实际上无法做到这一点。糟透了,但是真的。(如果有什么不同,我会按照下面的建议尝试子类化 CodingTheWheel .

    7 回复  |  直到 16 年前
        1
  •  2
  •   Konrad Rudolph    16 年前

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

        2
  •  4
  •   willeM_ Van Onsem    9 年前

    创建中间垫片类型“ RectangleEx “,并定义与第三方字符串类型之间的自定义转换。每当您与任何一个API交谈时,都要通过Shim类来这样做。

    另一种方法是推导 class 从任一 rect Rectangle ,并在其中插入转换/构造函数。

        3
  •  3
  •   willeM_ Van Onsem    9 年前

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

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

    然后你就可以把 rectangle 在里面 R() “正确的事情”就会发生。

        4
  •  0
  •   willeM_ Van Onsem    9 年前

    在您的情况下,这可能是不可行的,但我已经看到人们使用一些预处理器foo来将类型按摩到兼容性中。

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

    也有可能你根本不想这样做,而是想重新评估一些早期的决定。或者没有。

        5
  •  0
  •   willeM_ Van Onsem    9 年前

    为什么不这样简单的事情:(注意这可能/可能不会编译)但是你得到了这个想法…

    
    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;
    
    }
    
    

    编辑: 看来科科和我也有同样的想法。

        6
  •  0
  •   willeM_ Van Onsem    9 年前

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

        7
  •  -1
  •   bernhardrusch    16 年前

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

    rect运算符=(const rect&,const rectangle&)

    更多关于这方面的C++编程语言的Bjarne Stroustrup或可能在这个页面: http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html