1

是否可以定义一个不是类模板并且可以存储(例如在构造时)对任何特定类型的引用并稍后通过 getter 方法检索它的类?

struct Wrapper {
  template<typename T> Wrapper(const T& t): t_(t);

  // How to store the reference??
};

Boost::variant当然不是解决方案,因为它是作为类模板实现的。而且我没有 RTTI。(它在 HPC 环境中,性能就是一切!)

getter()应该能记住类型。这样auto以后就可以使用了。

4

2 回答 2

5

getter() 应该能够记住类型。

它不能。你删除了类型。当您将任意类型的值放入一致类型的对象中时,就会发生这种情况。这称为“类型擦除”:从包含类中删除原始类型。

这样做的后果之一是无法神奇地恢复该类型。您不能让一个类在每个实例的基础上使用一种类型进行初始化,然后让其成员函数之一根据该特定实例的初始化方式返回不同的类型。

C++ 是一种静态类型语言。每个函数的返回类型必须在编译时定义。它不能因为您在运行时放入类中而改变。

它不记得类型。

我不能使用 RTTI。

那么你想要的是一个void*. RTTI 是以类型安全的方式恢复原始值类型的唯一方法。如果你不想要类型安全,那么你想要一个void*. 您要做的就是编写一个包装器static_cast<T*>

void*在and周围写一个包装器真的没有意义static_cast。如果那是您想要的,并且您愿意接受使用它们的风险(即:破坏类型系统),那么就使用它。存在的原因boost::any是提供类型安全 void*的,这样至少您知道什么时候错误地转换它。

于 2012-08-04T22:42:34.323 回答
3

boost::any http://www.boost.org/doc/libs/1_50_0/doc/html/any.html

std::vector<boost::any> many;
int i = 5;
std::string a = "5";

many.push_back(i);
many.push_back(a);

std::string res;
if (many[1].type() == typeid(std::string))
  res = boost::any_cast<std::string>(many[1]);
于 2012-08-04T19:28:05.977 回答