Men*_*des 0 c++ vector unique-ptr c++11
我有以下情况:
\n\nBase是一个基类。\nT是一个模板,可以假定 的任何派生类Base。
底层为我提供来自Base类的数据,我需要将其转换为上层(编写代码的层)上的特定类才能在用户级别上工作。
这是代码:
\n\ntemplate <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}\nRun Code Online (Sandbox Code Playgroud)\n\n如何有效地将收到的vectorofunique_ptr\xc2\xb4s类转换Base为vectorofunique_ptr\xc2\xb4s类型T,如图所示。
谢谢你的帮助。
\n这会做:
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)。
| 归档时间: |
|
| 查看次数: |
1954 次 |
| 最近记录: |