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拥有Holding一个指向.std::unique_ptrB

于 2012-11-14T16:25:17.027 回答
0

如果可能的馆藏足够相似,您可以使用类型擦除。

#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;
}

您需要弄清楚所有可能的 T 之间的共性是什么。您可能还想添加一些函数来获取typeid和 排除实际类型等。看看boost::any.

如果你更喜欢实验性的东西,你可以看看Boost.Type Erasure,它去掉了一些样板,但还不是正式版本的一部分。

于 2012-11-14T16:34:43.503 回答
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 回答