我正在尝试使用模板元素的容器,但它没有编译,因为没有给出第一个参数
所以我想将以下类放在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;
};
我想我理解为什么我不能将不同大小的元素放在容器中,这就是我使用ptrTemplateParam
和cpyTemplateParam
的原因。 (我也尝试过使用shared_ptr)
您知道如何解决我的问题
我可以使用boost库
我看过这个link,但我不知道如何宣布吸气剂。
编辑:
感谢您的回答,我可以将其存储在地图中,但我无法在地图中插入元素,我必须使用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是解决方案
答案 0 :(得分:3)
如果你需要一个包含不同类型元素的容器,那么你就拥有了 基本上有3种方式:
从你的问题中不清楚什么对你最好。
答案 1 :(得分:2)
恕我直言,如果你想在同一个容器中放入不同的项目,你应该考虑使用Boost.Variant。这不是这里你的实际例子的直接答案,但我发现这种模式对这类问题非常有用。您可以避免使用指针并以优雅的方式强制继承。
class A {};
class B {};
typedef boost::variant<A, B> item_t;
...
vector<item_t> my_container;