2013-07-12 67 views
1

我正试图保存一些从文件中读取的数据。数据是一个数组,可以是几种类型之一;总之,float等我想这个抽象的数据一类,所以我马上想到:运行时的C++变量类型

class BaseData { 
public: 
    void *data; 
    virtual void foo() = 0; 
}; 

template <typename T> 
class Data : public BaseData { 
public: 
    T *data; 

    Data(const File *file) { 
     data = (T*) file->data; 
    } 

    T operator()(int x, int y, int z) { 
     return data[x + y*yd + z*zd]; 
    } 

    void foo() {} 
}; 

我读文件时实例化对象的权利和使用switch语句然后当我要努力与不同的数据对象我做的:

if (Data<short> *d = dynamic_cast<Data<short> *>(image->data)) { 
    cout << (*d)(100, 50, 100) << endl; 
} 

其中图像 - >数据是BaseData类型。

你对此有何看法?这是关于事情的正确方法吗?理想情况下,我想抓住数组(和类型)并对其进行处理,但我不知道在编译时类型是什么。

+1

只需简单点,通过在'class Data'中声明'T * data',就可以隐藏'class BaseData'中定义的void * data - 永远不会使用void指针。 –

+0

我会推荐[boost :: variant](http://www.boost.org/doc/libs/1_54_0/doc/html/variant.html)。它允许你制作类型安全的工会。 –

回答

1

您对此有何看法?这是关于事情的正确方法吗?理想情况下,我想抓住数组(和类型)并对其进行处理,但我不知道在编译时类型是什么。

是的,一般来说,创建一个参数化多态包装器就像你正在做的是一个很好的方法。它类似于boost::any所示的“Any”设计模式,并将运行时类型信息附加到其他不相关的非多态类型,例如int,float等。

您还应该查看boost::variant这是一个相似但略有不同的方法。在变体中,这组类型成为基础的模板参数。作为一个专业人员,这允许一些额外的编译时检查,也是一个稍微更有效的实现,因为它有一个可以说是更复杂的接口。