繁体   English   中英

c++ 可以存储这个吗? 模板<typename T> (存储类型名称 T 以便我以后可以重用它?)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM