c++ 将 unique_ptr<Base> 的向量转换为 unique_ptr<Derived>,其中导出是模板

Men*_*des 0 c++ vector unique-ptr c++11

我有以下情况:

\n\n

Base是一个基类。\nT是一个模板,可以假定 的任何派生类Base

\n\n

底层为我提供来自Base类的数据,我需要将其转换为上层(编写代码的层)上的特定类才能在用户级别上工作。

\n\n

这是代码:

\n\n
template <class T> class Access {\n       std::vector<std::unique_ptr<T> getData();        \n}\n\ntemplate <class T>\nstd::vector<std::unique_ptr<T> getData()\n{\n      /// Get data from below layer\n      std::vector<std::unique_ptr<Base>> retData; \n\n      retData = getDataFromBelowLayer();\n\n      /// Now I have to cast Base to T\n      std::vector<std::unique_ptr<T>> retCastData;\n\n      for (auto &item : retData)\n      {\n          std::unique_ptr<T> = static_cast<T>(item); <<---- NOT WORKING\n          retCastData.push_back(std::move(item));    <<---- NOT WORKING\n      }\n\n      return retCastData;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何有效地将收到的vectorofunique_ptr\xc2\xb4s类转换Basevectorofunique_ptr\xc2\xb4s类型T,如图所示。

\n\n

谢谢你的帮助。

\n

dav*_*igh 5

这会做:

struct Base {};

template<typename T>
struct Derived : public Base {};


template <typename T>
std::vector<std::unique_ptr<T> > getData()
{
      //add some checking:
      static_assert(std::is_base_of<Base, T>::value, "T must be derived from Base");

      std::vector<std::unique_ptr<Base> > retData; 
      //fill it somehow

      std::vector<std::unique_ptr<T> > retCastData;

      for (auto& item : retData)
      {
          auto t = std::unique_ptr<T>(static_cast<T*>(item.release()));   //(*)
          retCastData.push_back(std::move(t));
      }

      return retCastData;
}

int main()
{
    getData<Derived<int> >();   //or some other type than "int"
}
Run Code Online (Sandbox Code Playgroud)

主要的事情发生在标有 的行中(*)。这里唯一指针被释放,返回的原始指针被向下转换为派生类,然后插入到向量中。(这段代码的核心是受到这个线程的启发,但是这里省略了删除器的东西。)

请注意,类模板这一事实Derived在这里根本不重要(除了您必须传递Derived</*some type*/>而不是Derivedto getData)。