C++ 如何避免不必要的std::vector构造<;基本*>;

C++ 如何避免不必要的std::vector构造<;基本*>;,c++,design-patterns,C++,Design Patterns,我有两节课 class Base{ ... }; class Derived : public Base { ... }; 以及其他一些操作和修改Base指针集合的函数: void foo(std::vector<Base *> ptrs_to_base); 这将是一种需要模板的解决方案,并且不会明显表明只需要Base*类型的指针。编辑:W.F.给出了识别此模板错误用法的方法。它仍然需要对ptrs\u to\u元素进行不必要的构造问题在于函数将向量作为参数。与任何其他标准容器一

我有两节课

class Base{ ... };

class Derived : public Base { ... };
以及其他一些操作和修改
Base
指针集合的函数:

void foo(std::vector<Base *> ptrs_to_base);

这将是一种需要模板的解决方案,并且不会明显表明只需要
Base*
类型的指针。编辑:W.F.给出了识别此模板错误用法的方法。它仍然需要对
ptrs\u to\u元素进行不必要的构造

问题在于函数将向量作为参数。与任何其他标准容器一样,vector不实现简单接口,也不打算派生

这意味着,如果你只有一个向量的对象,需要一个向量的指针,你唯一的选择是建立一个新的向量


由于这个原因,标准C++容器非常适合存储对象,但是公共接口应该使用…简单包装的界面使飞行转换更容易(如果不是简单可行的话)

您是否在寻找类似于?PS的东西。与原始指针相比,更喜欢智能指针…@W.F.太棒了!我不知道这个功能。这改进了基于模板的方法。在这种情况下,我只有一个
std::vector
。有什么想法吗?@W.F.关于智能指针:在这种情况下,我想使用原始指针,因为它们传达的概念是,所有权不会通过将对象传递到
foo
而转移。我认为,如果您希望同时支持值和指针,我想您将无法处理没有重载的
foo
,恐怕:(除非您使用的是c++17并且在使用
if constexpr
时没有问题,谢谢!那么在我的示例中,我会使用什么类型的包装器呢?
template <typename Iter>
void foo(Iter begin, Iter end) {
   //*begin is of type Base*
   ...
}

std::vector<Derived> elements;
std::vector<Derived *> ptrs_to_elements = ... // construct from elements
foo(ptrs_to_elements.begin(), ptrs_to_elements.end());