C ++可以存储这个吗?模板<类型名 T>(存储类型名 T,以便以后可以重用它?

  • 本文关键字:类型 存储 模板 c++
  • 更新时间 :
  • 英文 :

#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,并将处理所包含类型的责任交给用户定义的访问者。例如,T0存储variant<int, double>

  • 或者,使用std::any并将恢复类型信息的责任推给调用者。

  • 或者,通过多态性强制类型擦除;而不是void*拥有一个指向基类的指针。

  • 另一种类型的擦除方法是Sean Parent的"擦除"方法;运行时多态性";方法,其中用户将所需行为的实现作为可以通过参数相关查找发现的函数提供。通过仅内部多态性,您可以为所包含的指针调用适当的函数(与std::function的实现方式没有太大区别(。

相关内容

最新更新