【发布时间】:2014-02-06 02:39:30
【问题描述】:
我希望本质上结合指向某些数据及其类型的指针:
data_pointer.h
class DataPointer {
public:
DataPointer(T *data) : data_(data) {
}
inline double data() { return double(*data_); }
private:
T *data_;
};
在那里,data_ 是指向可以是不同类型的数据的指针,但用户总是希望它以双精度形式返回。您可以保留类型和数据并在 data() 函数中返回类型时打开类型,但这似乎比它需要的更难。
下面的例子非常做作,但我认为它明白了这一点:
main.cpp
#include "data_pointer.h"
enum Type {
kShort,
kInt,
kFloat,
kDouble
};
DataPointer d() {
Type t;
// char * is returned, but is actually a pointer to some other type indicated by
// the type parameter (void * would probably be the standard way of doing this)--
// this is a straight C library
char *value = getValueFromExternalSource(&type);
switch (type) {
case kShort: return DataPointer<short>(reinterpret_cast<short *>(value));
case kInt: return DataPointer<int>(reinterpret_cast<int *>(value));
case kFloat: return DataPointer<float>(reinterpret_cast<float *>(value));
case kDouble: return DataPointer<double>(reinterpret_cast<double *>(value));
}
}
int main(int argc, char *argv[]) {
float f = 13.6;
asi::DataPointer<float> dp(&f); // This works just fine
printf("%f\n", dp.data());
}
不过,编译在d() 的声明处给了我'DataPointer' does not name a type,这是有道理的,因为它没有与之关联的类型。
我很确定我误解了模板的工作方式,而且我几乎完全确定我缺少一些语法知识,但是你们能帮忙吗?我对不同的方法持开放态度。
我正在运行 g++ 3.4.6,我知道它已经过时了,但有时你会受到无法控制的事情的限制。
谢谢。
【问题讨论】:
-
你在类声明之前缺少模板
-
DataPointer本身不被视为一种类型,它是一个模板。要将其转换为类型,您还必须提供模板参数,如DataPointer<double>。当您尝试从基于开关的函数返回不同类型时,这对您来说尤其成问题。 -
... 通常 C++ 不能这样工作,它更像是 Java'ish。问题是
d()应该有一个单一 返回类型,而DataPointer<int>、DataPointer<short>等是完全不同的 类型。因此,您要么必须将 DataPointer包装成 boost::any之类的东西,要么重新考虑整个方法。好吧,实际上整个 DataPointer 看起来像一个自酿的boost::any -
嗯,实际上整个 DataPointer 看起来就像一个自制的
boost::any。看看boost.org/doc/libs/1_55_0/doc/html/any.html