【发布时间】:2013-05-14 05:19:33
【问题描述】:
首先让我们从问题开始。我有一棵树,我想做以下事情:
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_
}
};
我遇到了容器协方差问题 - std::vector<DerivedA*>(或 DerivedB*)与 std::vector<Base*> 不同。但同时我不想在AddChildren 中创建一个全新的向量,只是为了将它们添加到std::vector<Base*>。
那么有没有一种方法可以将向量直接添加到children_ 的列表中而不会产生太多的性能开销?
我考虑过但不特别喜欢的事情:
- 逐个检查并添加每个元素
- 创建一个新的
std::vector<Base*>以添加到children_(除非编译器可以优化它?) - 传入
std::vector<Base*>,并对每个元素进行动态转换。 - 传入
std::vector<Base*>,通过dynamic_cast检查第一个元素,然后使用static_cast进行其余部分。 - 使
AddChildren成为模板函数(我想不出如何使它工作,因为std::vector被存储起来,然后稍后调用AddChildren)。
我可以 reinterpret_cast 但这很危险,Union 呢?这很危险吗?
union DerivedBUnion {
std::vector<Base*> base_;
std::vector<DerivedB*> derivedB_;
}
任何帮助表示赞赏。
【问题讨论】:
标签: c++ c++11 stl containers covariance