【问题标题】:How Do I Return a Templated Class in c++?如何在 C++ 中返回模板类?
【发布时间】: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&lt;double&gt;。当您尝试从基于开关的函数返回不同类型时,这对您来说尤其成问题。
  • ... 通常 C++ 不能这样工作,它更像是 Java'ish。问题是d() 应该有一个单一 返回类型,而DataPointer&lt;int&gt;DataPointer&lt;short&gt; 等是完全不同的 类型。因此,您要么必须将 DataPointer 包装成 boost::any 之类的东西,要么重新考虑整个方法。好吧,实际上整个 DataPointer 看起来像一个自酿的 boost::any
  • 嗯,实际上整个 DataPointer 看起来就像一个自制的 boost::any。看看boost.org/doc/libs/1_55_0/doc/html/any.html

标签: c++ c++03


【解决方案1】:

您不想在这里使用模板。如果您的值可以是多种类型之一,则要使用联合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2015-12-14
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多