我正在尝试存储从文件中读取的一些数据。数据是一个数组,可以是几种类型之一;我试图将这些数据抽象为一个类,所以我立即想到:
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语句来实例化正确的对象,然后当我想使用不同的Data对象时:
if (Data<short> *d = dynamic_cast<Data<short> *>(image->data)) {
cout << (*d)(100, 50, 100) << endl;
}
其中image-&gt;数据的类型为BaseData
。
您对此有何看法?这是正确的做事方式吗?理想情况下,我想获取数组(和类型)并使用它做一些事情,但我不知道在编译时类型是什么。
答案 0 :(得分:1)
您对此有何看法?这是正确的做事方式吗?理想情况下,我想获取数组(和类型)并使用它做一些事情,但我不知道在编译时类型是什么。
是的,一般来说,像你一样创建参数化多态包装是一种很好的方法。它类似于{Any}设计模式,例如boost::any
,并将运行时类型信息附加到其他不相关的非多态类型,如int,float等。
您还应该看boost::variant
这是一种类似但略有不同的方法。在变体中,类型集成为Base的模板参数。作为专家,这允许一些额外的编译时检查以及稍微更高效的实现,因为它具有可以说是更复杂的接口。