我有以下情况:
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
Base
个vector
班级投放到unique_ptr´s
T
changeImage
类型的'next'
,如图所示
感谢您的帮助。
答案 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
)。