gpt4 book ai didi

c++ - 存储模板类型以将Base转换回Derived

转载 作者:行者123 更新时间:2023-12-02 10:13:06 26 4
gpt4 key购买 nike

所以我有这些课:

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 {};
对于您的问题,您无需将其转换回派生类型,只需要使vector成为指向Base类的指针的 vector (并且在插入函数中,接受Derived类型作为引用,即可将其传递给 vector 的地址)。
注意:在实现中,您会看到我传递了shared_ptr-当您在 vector 中使用shared_ptr而不是不安全的指针时,地址的所有权变得很明显(感谢 @idclev463035818)。
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
};

关于c++ - 存储模板类型以将Base转换回Derived <T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62842983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com