【问题标题】:How can I have a container of template elements我怎样才能有一个模板元素的容器
【发布时间】:2023-03-19 06:44:01
【问题描述】:

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

所以我想将以下类放在 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)

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

我可以使用 boost 库

我看过这个link,但我不知道如何声明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 是解决方案

【问题讨论】:

    标签: c++ templates c++11 containers


    【解决方案1】:

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

    1. 拥有包含变体或联合体的容器。
    2. 拥有多态指针或多态智能指针的容器。
    3. 使用侵入式容器。

    从您的问题中不清楚什么最适合您。

    【讨论】:

    • 可能作者只是不需要使用异构容器。它们比通常的更慢且更复杂。
    • @Axilles 是的,但他发布的代码看起来确实试图让std::map&lt;std::string,boost::any&gt; 或类似的东西。
    • 于是,他试图重新发明轮子,即 boost::any。行。但我不喜欢这个东西,因为它非常复杂,可能不快并且可能导致各种错误。不过,这只是我的看法。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 2016-04-07
      • 2014-12-04
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多