1

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

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->data 的类型为BaseData

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

4

1 回答 1

1

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

是的,一般来说,像您正在做的那样创建参数多态包装器是一种好方法。它类似于以 为例的“任何”设计模式boost::any,并将运行时类型信息附加到其他不相关的非多态类型,例如 int、float 等。

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

于 2013-07-12T21:48:42.307 回答