2010-05-04 46 views

回答

1

如果要創建自己的模型,請使用模板和運算符重載將對指針/數組的訪問包裝到一起。下面是一個小例子:

#include <iostream> 

using namespace std; 

template <class T> 
class Array 
{ 
private: 
    T* things; 

public: 

    Array(T* a, int n) { 
     things = new T[n]; 
     for (int i=0; i<n; i++) { 
      things[i] = a[i]; 
     } 
    } 

    ~Array() { 
     delete[] things; 
    } 

    T& operator [](const int idx) const { 
     return things[idx]; 
    } 
}; 

int main() 
{  
    int a[] = {1,2,3}; 
    double b[] = {1.2, 3.5, 6.0}; 

    Array<int> intArray(a, 3); 
    Array<double> doubleArray(b, 3); 

    cout << "intArray[1]: " << intArray[1] << endl; 
} 
+0

然而,這隻有一個類型每個實例。我不確定如何在一個實例中實現可以存儲不同數據類型的容器。也許通過使用功能模板? – Nils 2010-05-04 12:16:00

12

您可以使用boost::anyboost::variant(兩者之間的比較:[1])。

另外,如果「不同類的對象」有一個共同的祖先(比如,Base),你可以使用std::vector<Base*>(或std::vector<std::tr1::shared_ptr<Base> >),並將結果轉換到Derived*當你需要它。

+1

還有助推:變種。但我不會推薦這種方法,除非你真的想要保持不相關類的對象。否則選項2可能會更好。 – 2010-05-04 11:25:41

+0

如果集合是已知的,我會推薦'Variant' over'Any'。靜態檢查是一個巨大的吸引力。這也是一個更快,這是一個不錯的獎金。 – 2010-05-04 12:52:40

3

定義了一個基類並從中派生出所有的類。

然後,你可以創建一個類型(基本*)的列表,它可能包含基本類型的任何對象或派生類型

+1

它需要是指向基類(或至少某種引用)的指針,否則你會將對象分割到基礎上。 – Skurmedel 2010-05-04 11:22:28

+0

@Skurmedel - 顯然它需要是一個指針。誰會想到把它作爲價值?......無論如何,我會編輯我的回答 – SysAdmin 2010-05-04 11:29:17

+1

我會2年前:) – Skurmedel 2010-05-04 12:25:48

2

看一看boost::fusion這是一個STL-翻版,但有能力存儲容器中的不同數據類型

相關問題