将类A的reinterpret_cast向量转换为类B的向量

时间:2015-06-15 08:54:10

标签: c++ c++03

假设我有两个课程AB,以及一个类A的矢量,如下所示:

class A {
    int foo;
    int bar;
    void someMethod();
};
class B {
    uint foo;
    uint bar;
    void someOtherMethod();
};
std::vector<A>  va;

我希望将va解释为B的向量,因为intuint可以重新解释。

重新解释的最佳做法是什么? 例如,如果我想在someOtherMethod()上调用va,我可以执行((std::vector<B> *)(&va))->someOtherMethod()。但这是最好的做法吗?

在我看来,reinterpret_cast<std::vector<B> >(va).someOtherMethod()不起作用。

此外,我正在研究C ++ 03。

- 更新 -

很抱歉我误解了自己的问题。 然而,我的问题与这个问题有很大的不同。所以我创建了另一个问题here

我将尽快结束这个问题:这个问题可以看作是一个独立的问题,我认为下面的答案之一已经足够被接受了。

3 个答案:

答案 0 :(得分:7)

别。你认为你能做到的任何方式都会导致未定义的行为。创建一个新的向量并复制值。

答案 1 :(得分:2)

程序行为未定义,因为类型不相关。

一种解决方案是编写强制转换操作符以将class B实例复制到class A实例。在课程B中,写下

operator A() const
{
    A a;
    a.foo = this->foo; // ToDo - check `this->foo` is an appropriate size
    a.bar = this->bar; // ToDo - check `this->bar` is an appropriate size
    return a; // compiler will elide the value copy
}

答案 2 :(得分:0)

你或许能够创建一个联合类型C,它可以被读作int或uint,而不是制作一个向量。

vector<uint>

但如果您需要将其传递给期望 Unknown activity items supplied: ( "QLPrintPageRenderer: 0x187bc720>", "UIPrintInfo: 0x1c0b51f0>" ) 的方法,那么这将无效。

在我看来,解决这个问题的正确方法是将需要向量的方法转换为模板,以便它可以接受任何容器类型。更好的是,使它像STL方法一样,并使用迭代器或迭代器对。