1

テンプレート要素のコンテナを取得しようとしていますが、最初の引数が指定されていないためコンパイルされません

だから私は次のクラスを 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;
  };

異なるサイズの要素をコンテナーに入れることができない理由を理解していると思います。それが私が and を使用ptrTemplateParamした理由cpyTemplateParamです。(shared_ptrでも試しました)

どうすれば問題を解決できるか分かりますか

ブーストライブラリを使用できます

このリンクを見ましたが、ゲッターを宣言する方法がわかりません。

編集:

あなたの答えのおかげで、マップに保存できますが、マップに要素を挿入できず、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);

Edit2 boost::any が解決策でした

4

2 に答える 2

3

異なるタイプの要素を含むコンテナーが必要な場合は、基本的に 3 つの方法があります。

  1. バリアントまたはユニオンのコンテナーがあります。
  2. ポリモーフィック ポインターまたはポリモーフィック スマート ポインターのコンテナーがあります。
  3. 邪魔にならないコンテナを使用してください。

あなたの質問からは、あなたにとって何が最善かは不明です。

于 2013-07-01T07:25:48.893 に答える