首先让我们从问题开始。我有一棵树,我想做以下事情:
class Base {
std::vector<Base*> children_;
};
class DerivedA : public Base {
//adds some members
};
class DerivedB : public Base {
void AddChildren(std::vector<DerivedA*> children, int position) {
//Do stuff based on the fact that it's a DerivedA
//Add to the list of children_
}
void AddChildren(std::vector<DerivedB*> children, int position) {
//Do stuff based on the fact that it's a DerivedB
//Add to the list of children_
}
};
我遇到了容器协方差问题 - a std::vector<DerivedA*>
(或DerivedB*
)与 a 不同std::vector<Base*>
。但同时我不想创建一个全新的向量,AddChildren
只是为了将它们添加到std::vector<Base*>
.
那么有没有一种方法可以将向量直接添加到列表中children_
而没有太多的性能开销?
我考虑过但不特别喜欢的事情:
- 逐个检查并添加每个元素
- 创建一个新
std::vector<Base*>
的添加到children_
(除非编译器可以优化它?) - 传入一个
std::vector<Base*>
, 和 dynamic_cast'ing 每个元素。 - 传入 a
std::vector<Base*>
,通过 a 检查第一个元素dynamic_cast
,然后使用static_cast
其余元素。 - 制作
AddChildren
一个模板函数(我想不出如何让它工作,因为它std::vector
被存储起来,然后稍后调用 AddChildren)。
我可以 reinterpret_cast 但这很危险,Union 呢?这很危险吗?
union DerivedBUnion {
std::vector<Base*> base_;
std::vector<DerivedB*> derivedB_;
}
任何帮助表示赞赏。