我有一个模板类,
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中使用一种实例变量,但不想让持有模板类。我的设计选择是什么?
答案 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,这会夺走一些锅炉,但还不是正式版的一部分。