#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();
}
我的问题是";记住";类型为CCD_ 1,因此我可以替换CCD_。
我需要void*
指针指向未知类型,并且我需要键入强制转换为正确的类型来检索我在其中存储的内容。创建Item
时,没有注册任何内容(不应该注册任何内容(。
如果你们知道如何做到这一点,是否也可以改变";记住";在编译时?
pass
作为模板可以接收无限多个类型,而next
的返回类型固定为单个类型。您正在寻求一种将所有类型视为单一类型的方法,不幸的是,void*
是唯一的方法;无法恢复pass
中使用的类型。
我不能100%确定这个类的所有用例是什么,所以我将描述一些你应该研究的类型擦除技术:
-
考虑使用
std::variant
,并将处理所包含类型的责任交给用户定义的访问者。例如,T
0存储variant<int, double>
-
或者,使用
std::any
并将恢复类型信息的责任推给调用者。 -
或者,通过多态性强制类型擦除;而不是
void*
拥有一个指向基类的指针。 -
另一种类型的擦除方法是Sean Parent的"擦除"方法;运行时多态性";方法,其中用户将所需行为的实现作为可以通过参数相关查找发现的函数提供。通过仅内部多态性,您可以为所包含的指针调用适当的函数(与
std::function
的实现方式没有太大区别(。