1

首先让我们从问题开始。我有一棵树,我想做以下事情:

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_;
}

任何帮助表示赞赏。

4

1 回答 1

5

有什么问题children_.insert(children_.end(), children.begin(), children.end())?在考虑各种类型转换之前,确定简单的解决方案会带来性能问题难道没有意义吗?

于 2013-05-14T05:44:01.737 回答