2

私はテンプレート化されたクラスを持っています、

template<typename T>
class TClass
{
public:
   //functions here
};

class Holding {
  public:

 private:
  TClass<T>  m_item;  //don't want this
};

int main() {
   Holding hd;
   //do whatever
   return 0;
}

Holding に一種のインスタンス変数が必要ですが、Holding をテンプレート クラスにしたくありません。私のデザインオプションは何ですか?

4

4 に答える 4

2

どんなタイプでも抱きしめたくなるようです。それが本当に当てはまる場合は、次を使用できますboost::any

class Holding {
  public:

 private:
  TClass<boost::any>  m_item;  //you want this?
};

Boost を使用しない場合は、any自分で実装するか、このサイトでその実装を検索するか、Google を使用できます。

于 2012-11-14T16:27:32.450 に答える
1

TClass非テンプレート基本クラスから派生し、へのポインター (おそらく) をB保持しています。Holdingstd::unique_ptrB

于 2012-11-14T16:25:17.027 に答える
0

私はあなたの質問を正しく理解していないかもしれません。基本的に、テンプレートパラメータを介して設定する必要があるテンプレートクラスTClassがあります。次に、TClassを所有するHoldingがありますが、何らかの理由でHoldingをテンプレートにしたくありません。

これは、Holdingがテンプレートパラメータを静的に定義する必要があることを意味します

TClass<SomeClass> m_item;

さて、あなたはコードでこれを望まないと言います...テンプレートパラメータを提供したくないのか、Tを提供したくないのかわかりません。Tの場合、上記のコードで問題が解決します。それ以外の場合は、typedefを使用してテンプレート引数を削除し、次のような「テンプレートなし」の型にする必要があります。

typedef TClass<int> intTClass; // replace int by whatever param you want

その後、として使用することができます

class Holding {
  public:

 private:
  intTClass m_item;  //don't want this
};
于 2012-11-14T16:29:55.090 に答える
0

可能な持ち株が十分に類似している場合は、type-erasure を使用できます。

#include <memory>

class HeldType {
public:
  virtual void myfunc() = 0;
  virtual ~HeldType() {}
};

template<typename T>
class HeldTypeModel : public HeldType {
public:
  HeldTypeModel(const T& t) : data_(t) {}
  void myfunc() { data_.myfunc(); }
private:
  T data_;
};

class TClass {
public:
  TClass() : x_(nullptr) {}

  template<typename T> 
  void set_t(const T& t) {
    x_.reset(new HeldTypeModel<T>(t));
  }

  std::unique_ptr<HeldType> x_;
};

class model {
public:
  void myfunc() {}
};

int main()
{
  TClass x;
  x.set_t(model{});
  return 0;
}

typeid考えられるすべての T の共通点を把握する必要があります。また、 を取得して実際の型をキャストするなどの関数を追加することも必要になるでしょう。 を参照してくださいboost::any

より実験的な側面に興味がある場合は、 Boost.Type Erasureを見ることができます。これは、ボイラープレートの一部を取り除きますが、まだ公式リリースの一部ではありません。

于 2012-11-14T16:34:43.503 に答える