[英]accessing objects in a vector of template class objects
通過實現這個答案,我有一個模板類的各種對象的向量: https : //stackoverflow.com/a/36588158/5088457
我正在用qt開發。 但是我在投射/訪問這些對象時遇到了問題。 所以我的問題是,當我不知道模板類型時,如何獲取 shared_ptr 后面的對象? 正如你在下面的代碼片段中看到的,它是關於從向量 As 中獲取一個 AImpl 對象。 謝謝!
我認為作者的代碼片段是一個很好的最小示例:
class A{};
template <class T>
class AImpl : public A{
public:
T obj;
AImpl(T _obj):obj(_obj){}
~AImpl(){
cout << "Deleting " << obj << endl;
}
};
int main(int argc, char** argv)
{
AImpl <string>* a1 = new AImpl <string> ("string1234");
AImpl <int>* a2 = new AImpl <int> (1234);
AImpl <double>* a3 = new AImpl <double> (1.234);
vector <shared_ptr<A>> As;
As.push_back(shared_ptr<A>(a1));
As.push_back(shared_ptr<A>(a2));
As.push_back(shared_ptr<A>(a3));
}
所以我的問題是,當我不知道模板類型時,如何獲取
shared_ptr
后面的對象?
答案是你不能,分別,你不能從Aimpl
之外,這是唯一知道存儲對象類型的地方。
當所有類型擦除的對象共享一些公共接口時,主要使用類型擦除。 例如,在您的情況下,您可以將int
、 std::string
和double
輸入到輸出流中。 要通過指向基的指針A
執行此操作,您需要使用virtual
函數:
class A
{
public: virtual void print() const = 0;
};
template <class T>
class AImpl : public A
{
T obj;
public:
AImpl(T _obj) : obj(_obj) { }
~AImpl() { cout << "Deleting " << obj << endl; }
virtual void print() const override
{
cout << obj << endl;
}
};
然后,您可以打印出存儲在As
的所有類型擦除對象的值,如下所示:
for (const auto ptr& : As) As->print();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.