【问题标题】:reinterpret_cast vector of class A to vector of class B将 A 类的向量重新解释为 B 类的向量
【发布时间】:2015-06-15 08:54:09
【问题描述】:

假设我有两个类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 是可重新解释的。

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

在我看来reinterpret_cast&lt;std::vector&lt;B&gt; &gt;(va).someOtherMethod() 不起作用。

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

-- 更新--

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

我很快就会结束这个问题:这个问题可以被视为一个独立的问题,我认为以下答案之一足以被接受。

【问题讨论】:

  • I have two classes - 这太宽泛了。 为什么你想在他们之间转换? (我猜:一个是“他们的”向量,一个是“你的”?)
  • “在我看来,reinterpret_cast&lt;std::vector&lt;B&gt; &gt;(va).someOtherMethod() 不起作用。” - 是的,但您可以使用 reinterpret_cast&lt;std::vector&lt;unsigned&gt;*&gt;(&amp;va)-&gt;someOtherMethod()(与您的 C 相同的未定义行为风险) -style 强制转换符号)。请注意,风险不仅来自类型的布局 - 还有别名问题 - 所以你的 " since int and uint are re-interpretable" 论证是错误的。

标签: c++ c++03


【解决方案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
    }
    

    【讨论】:

    • the types are unrelated 完全正确。这是误解类关系传递性的一个重要案例。
    【解决方案3】:

    您也许可以通过创建一个可以读取为 int 或 uint 的联合类型 C 并创建一个向量来代替它。

    union C {
        int s;
        uint u;
    };
    
    std::vector<C> va;
    

    但是,如果您需要将其传递到需要 vector&lt;uint&gt; 的方法中,这将不起作用。

    在我看来,解决这个问题的正确方法是将期望向量的方法变成模板,以便它可以接受任何容器类型。更好的是,让它像 STL 方法一样,采用迭代器或迭代器对。

    【讨论】:

      猜你喜欢
      • 2022-11-07
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      相关资源
      最近更新 更多