2010-05-04 270 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-翻版,但有能力存储容器中的不同数据类型

相关问题