簡體   English   中英

訪問模板類對象向量中的對象

[英]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之外,這是唯一知道存儲對象類型的地方。

當所有類型擦除的對象共享一些公共接口時,主要使用類型擦除。 例如,在您的情況下,您可以將intstd::stringdouble輸入到輸出流中。 要通過指向基指針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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM