テンプレート要素のコンテナを取得しようとしていますが、最初の引数が指定されていないためコンパイルされません
だから私は次のクラスを 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;
};
異なるサイズの要素をコンテナーに入れることができない理由を理解していると思います。それが私が and を使用ptrTemplateParam
した理由cpyTemplateParam
です。(shared_ptrでも試しました)
どうすれば問題を解決できるか分かりますか
ブーストライブラリを使用できます
このリンクを見ましたが、ゲッターを宣言する方法がわかりません。
編集:
あなたの答えのおかげで、マップに保存できますが、マップに要素を挿入できず、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 が解決策でした