我如何才能拥有一个模板元素的容器

How can I have a container of template elements

本文关键字:元素 有一个 拥有      更新时间:2023-10-16

我试图拥有一个模板元素的容器,但它没有编译,因为第一个参数没有给定

所以我想把以下类放在std::map 中

  template <typename T>
  class TemplateParam
  {
    ITemplateParam<T>   param_;
  public:
    TemplateParam(T value)
    {
      if (sizeof(value) >= sizeof(void*))
        param_ = ptrTemplateParam<T>(value);
      else
        param_ = cpyTemplateParam<T>(value);
    }
    const T &getParam() const { return param_.getParam(); }
  };

ITemplateParam

  template <typename U>
  class ITemplateParam
  {
  public:
    virtual ~ITemplateParam(){}
    virtual const U&    getParam() const = 0;
  };

我想我理解为什么我不能把不同大小的元素放在一个容器里,这就是我使用ptrTemplateParamcpyTemplateParam的原因。(我也尝试过shared_ptr)

你知道我该如何解决的问题吗

我可以使用增强库

我已经看了这个链接,但我不知道如何声明getter。

编辑:

感谢你的回答,我可以将其存储在地图中,但我无法在地图中插入元素,我必须使用void*

所以我把我的课改成了:

  class ITemplateParam
  {
  public:
    virtual ~ITemplateParam(){}
    virtual const void *getParam() const = 0;
  };
  template <typename U>
  class ptrTemplateParam : public ITemplateParam
  {
    U   param_;
  public:
    ptrTemplateParam(U & param) : param_(param) {}
    virtual const void  *getParam() const { return param_; }
  };
  class TemplateParam
  {
    std::shared_ptr<ITemplateParam>     param_;
  public:
    template <typename T>
    TemplateParam(T value): param_(ptrTemplateParam<T>(value))
    {
    }
    const void *getParam() const { return param_->getParam();}
  };

我试着做

std::map<std::string, TemplateParam>  m_;
m_["integer"] = TemplateParam(5);

第2版boost::any是解决方案

如果您需要一个包含不同类型元素的容器,那么您可以基本上有三种方式:

  1. 有一个装有变体或接头的容器
  2. 拥有多态指针或多态智能指针的容器
  3. 使用侵入式容器

从你的问题中还不清楚什么对你最有利。

IMHO,如果你想把不同的项目放在同一个容器中,你应该考虑使用Boost.Variant。这不是对你这里的实际例子的直接回答,但我发现这种模式对这类问题非常有用。您可以避免以优雅的方式使用指针和强制继承。

class A {};
class B {};
typedef boost::variant<A, B> item_t;
...
vector<item_t> my_container;
相关文章: