存储模板类型以强制转换回派生<T>

Storing template type to cast Base back down to Derived<T>

本文关键字:派生 gt lt 转换 类型 存储      更新时间:2023-10-16

所以我有这些类:

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