是否可以定义一个类,它不是类模板,并且可以存储(例如在构造时)对任何特定类型的引用并稍后通过 getter 方法检索它?
struct Wrapper {
template<typename T> Wrapper(const T& t): t_(t);
// How to store the reference??
};
Run Code Online (Sandbox Code Playgroud)
Boost::variant当然不是解决方案,因为它是作为类模板实现的。而且我没有 RTTI。(在HPC环境下,性能就是一切!)
该getter()应能记住的类型。这样auto以后就可以使用了。
getter() 应该能够记住类型。
它不能。您删除了类型。这就是将任意类型的值放入一致类型的对象时会发生的情况。它被称为“类型擦除”:从包含类中删除原始类型。
这样做的后果之一是无法神奇地恢复该类型。你不能让一个类在每个实例的基础上用一个类型初始化,然后让它的一个成员函数根据该特定实例的初始化方式返回不同的类型。
C++ 是一种静态类型语言。每个函数的返回类型必须在编译时定义。它不会因为您在运行时放入类中的内容而改变。
它不记得类型。
我不能使用 RTTI。
那么你想要的是一个void*. RTTI 是以类型安全的方式恢复原始值类型的唯一方法。如果您不想要类型安全,那么您需要一个void*. 您要做的就是围绕static_cast<T*>.
围绕void*and编写包装器真的没有意义static_cast。如果这就是您想要的,并且您愿意接受使用它们的危险(即:破坏类型系统),那么就使用它。boost::any存在的原因是提供类型安全 void*,以便至少您知道何时错误地转换了它。