c ++将unique_ptr <base />的向量转换为unique_ptr <derived>,其中derived是模板

时间:2015-05-27 01:27:22

标签: c++ c++11 vector unique-ptr

我有以下情况:

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

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

以下是代码:

template <class T> class Access {
       std::vector<std::unique_ptr<T> getData();        
}

template <class T>
std::vector<std::unique_ptr<T> getData()
{
      /// Get data from below layer
      std::vector<std::unique_ptr<Base>> retData; 

      retData = getDataFromBelowLayer();

      /// Now I have to cast Base to T
      std::vector<std::unique_ptr<T>> retCastData;

      for (auto &item : retData)
      {
          std::unique_ptr<T> = static_cast<T>(item); <<---- NOT WORKING
          retCastData.push_back(std::move(item));    <<---- NOT WORKING
      }

      return retCastData;
}

如何有效地将收到的vector unique_ptr´s Basevector班级投放到unique_ptr´s T changeImage类型的'next',如图所示

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

这样做:

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"
}

主要的事情发生在标有(*)的行中。这里释放唯一指针,并将返回的原始指针下载到派生类,然后插入到向量中。 (此代码的核心受this thread启发,但此处省略了删除内容。)

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