我想有模板元素的容器,但它不是編譯,因爲第一個參數沒有給出我怎麼能有模板元素的容器
所以我想把下面的類在一個std ::地圖
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);
編輯2 boost :: any是解決方案
可能作者只是不需要使用異構容器。它們比通常的更慢,更復雜。 – eraxillan
@Axilles是的,但他的發佈代碼看起來像他試圖使'std :: map'或其他東西關閉。 –
因此,他試圖重新發明輪子,即boost :: any。好。 但我不喜歡這件事情,因爲它很複雜,可能不快,可能會導致各種錯誤。儘管如此,這只是我的看法。 – eraxillan