reinterpret_cast class A 的矢量到 class B 的矢量
reinterpret_cast vector of class A to vector of class B
假设我有两个 classes A
和 B
,以及一个 class A
的向量,如下所示:
class A {
int foo;
int bar;
void someMethod();
};
class B {
uint foo;
uint bar;
void someOtherMethod();
};
std::vector<A> va;
我想将 va
解释为 B 的向量,因为 int
和 uint
是可重新解释的。
重新解释的最佳做法是什么?
例如,如果我想在 va
上调用 someOtherMethod()
,我可以执行 ((std::vector<B> *)(&va))->someOtherMethod()
。但这是最佳做法吗?
在我看来 reinterpret_cast<std::vector<B> >(va).someOtherMethod()
不起作用。
此外,我正在研究 C++03。
--更新--
抱歉我误解了我自己的问题。
然而,我的问题将与这个有很大不同。所以我创建了另一个问题 .
我会尽快关闭这个问题:这个问题可以看作是一个独立的问题,我认为下面的一个答案足以被采纳。
不要。您认为可以做的任何方式都会导致未定义的行为。创建一个新向量并复制值。
程序行为未定义,因为类型不相关。
一个解决方案是编写一个强制转换运算符来将 class B
实例复制到 class A
实例。在classB
中写入
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
}
您可以创建一个联合类型 C,它可以读作 int 或 uint,然后创建一个向量。
union C {
int s;
uint u;
};
std::vector<C> va;
但是如果你需要将它传递给一个需要 vector<uint>
.
的方法,那将不起作用
在我看来,解决此问题的正确方法是将需要向量的方法制作成模板,以便它可以接受任何容器类型。更好的是,让它像 STL 方法一样并采用迭代器或迭代器对。
假设我有两个 classes A
和 B
,以及一个 class A
的向量,如下所示:
class A {
int foo;
int bar;
void someMethod();
};
class B {
uint foo;
uint bar;
void someOtherMethod();
};
std::vector<A> va;
我想将 va
解释为 B 的向量,因为 int
和 uint
是可重新解释的。
重新解释的最佳做法是什么?
例如,如果我想在 va
上调用 someOtherMethod()
,我可以执行 ((std::vector<B> *)(&va))->someOtherMethod()
。但这是最佳做法吗?
在我看来 reinterpret_cast<std::vector<B> >(va).someOtherMethod()
不起作用。
此外,我正在研究 C++03。
--更新--
抱歉我误解了我自己的问题。
然而,我的问题将与这个有很大不同。所以我创建了另一个问题
我会尽快关闭这个问题:这个问题可以看作是一个独立的问题,我认为下面的一个答案足以被采纳。
不要。您认为可以做的任何方式都会导致未定义的行为。创建一个新向量并复制值。
程序行为未定义,因为类型不相关。
一个解决方案是编写一个强制转换运算符来将 class B
实例复制到 class A
实例。在classB
中写入
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
}
您可以创建一个联合类型 C,它可以读作 int 或 uint,然后创建一个向量。
union C {
int s;
uint u;
};
std::vector<C> va;
但是如果你需要将它传递给一个需要 vector<uint>
.
在我看来,解决此问题的正确方法是将需要向量的方法制作成模板,以便它可以接受任何容器类型。更好的是,让它像 STL 方法一样并采用迭代器或迭代器对。