运行时的C ++变量类型

时间:2013-07-12 21:24:31

标签: c++ templates c++11 runtime

我正在尝试存储从文件中读取的一些数据。数据是一个数组,可以是几种类型之一;我试图将这些数据抽象为一个类,所以我立即想到:

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

您对此有何看法?这是正确的做事方式吗?理想情况下,我想获取数组(和类型)并使用它做一些事情,但我不知道在编译时类型是什么。

1 个答案:

答案 0 :(得分:1)

  

您对此有何看法?这是正确的做事方式吗?理想情况下,我想获取数组(和类型)并使用它做一些事情,但我不知道在编译时类型是什么。

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

您还应该看boost::variant这是一种类似但略有不同的方法。在变体中,类型集成为Base的模板参数。作为专家,这允许一些额外的编译时检查以及稍微更高效的实现,因为它具有可以说是更复杂的接口。