模板化类,如何表示为另一个类的成员变量而不使该类模板化

时间:2012-11-14 16:23:19

标签: c++ templates

我有一个模板类,

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

我想在Hold中使用一种实例变量,但不想让持有模板类。我的设计选择是什么?

4 个答案:

答案 0 :(得分:2)

看起来你想要持有任何类型。如果确实如此,那么您可以使用boost::any

class Holding {
  public:

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

如果您不使用Boost,那么您可以自己实施any或在此网站上搜索其实施或使用Google。

答案 1 :(得分:1)

从非模板基类TClass中获取B并让Holding将指针(可能是std::unique_ptr)保存到B

答案 2 :(得分:0)

我可能无法正确理解你的问题。基本上,您有一个模板类TClass,需要通过模板参数进行配置。然后你拥有拥有TClass的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
};

答案 3 :(得分: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并抛出实际类型等。看看{{1 }}

如果你更多地处于实验的一面,你可以看看Boost.Type Erasure,这会夺走一些锅炉,但还不是正式版的一部分。