[英]can c++ store this? template <typename T> (store the typename T so I can reuse it later?)
#include <iostream>
template <typename T>
class Item {
public:
T item;
void* ptr = nullptr;
Item(T var): item(var) {}
unknown next(){
if ((unknown*)ptr != nullptr){
std::cout<<"It is not a null pointer!"<<std::endl;
return (unkown*)ptr
}else{
std::cout<<"It is a null pointer..."<<std::endl;
return NULL
}
}
template <typename temp>
void pass(temp *var){
ptr = var;
}
};
int main() {
Item<int> i(100);
Item<float> n(200.0);
i.pass(&n);
i.next();
}
我的问题是“记住”类型T
以便我可以替换unknown
。
我需要void*
指针指向一个未知类型,我需要将类型转换为正确的类型以检索我存储在其中的内容。 创建Item
时,没有注册任何内容(不应该注册任何内容)。
如果你们知道怎么做,是否也可以在编译时更改“记住”的类型?
作为模板pass
可以接收无限多种类型,而next
的返回类型固定为单一类型。 您正在寻求一种将所有类型视为单一类型的方法,不幸的是void*
是唯一的方法; 您无法恢复pass
使用的类型。
我不能 100% 确定此类的所有用例是什么,因此我将描述一些您应该研究的类型擦除技术:
考虑使用std::variant
并将如何处理所包含的类型的责任放到用户定义的访问者中。 例如, Item<int, double>
存储一个variant<int, double>
或者,使用std::any
并将恢复类型信息的责任交给调用者。
或者,通过多态强制类型擦除; 而不是void*
,拥有一个指向基类的指针。
另一种类型擦除方法是 Sean Parent 的“运行时多态性”方法,在这种方法中,用户将所需行为的实现作为一个函数提供,该函数可以通过Argument-Dependent Lookup发现。 通过internal-only polymorphism ,您可以为包含的指针调用适当的函数(与std::function
的实现方式没有太大区别)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.