存储模板类型以强制转换回派生<T>
Storing template type to cast Base back down to Derived<T>
所以我有这些类:
class Base {
};
template <typename T>
class Derived<T>: public Base {
};
class util {
public:
template <typename T>
void add(Derived<T> arg) {
vec.push_back(arg);
}
void start() {
//cast back down to Derived<T>
}
private:
std::vector<Base> vec;
};
在start()
中,我想将它强制转换回Derived<T>
,但由于T可以是任何东西,所以如果没有类型,我就无法强制转换它。我想知道是否要将vec的类型信息的第一个元素存储在typedef
之类的文件中,这样我就可以在start()
中使用它
首先您有一个语法问题:
template <typename T>
class Derived<T>: public Base { // Won't compile, the class name is Derived, and it doesn't suppose to get specialized by T type
};
正确的方式:
template <typename T>
class Derived : public Base {};
对于您的问题,您不需要将其转换回派生类型,只需要使向量成为基类的指针向量(在插入函数中,接受derived类型作为引用,将其地址传递给向量(
注意:在实现中,您会看到我传递了一个shared_ptr-当您在向量中使用shared_ptr而不是不安全的指针时,这是为了使地址的所有权显而易见(感谢@idclev4463035818的注意(。
class util {
public:
template <typename T>
void add(std::shared_ptr<Derived<T>> arg) {
vec.push_back(arg);
// vec.push_back(&arg); // In case that you don't use shared_ptr, and pass arg by reference.
}
void start() {
for (auto d : vec) { /* ... */ }
}
private:
// Idea: std::vector<Base*> vec;
std::vector<std::shared_ptr<Base>> vec; // For safe memory management
};
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- 如何使用单独文件中的派生类访问友元函数对象
- 派生类销毁的最佳实践是什么
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 存储模板类型以强制转换回派生<T>
- 需要从 istream 和 ostream 派生 iostream
- 在 C++ 中用派生类型重写成员函数
- 具有多个类、派生类的C++正向声明
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- EASTL矢量<向量<int>>连续的
- 如果基类包含双指针成员,则派生类的构造函数
- 为什么此派生对象无法访问基类的后递减方法?