[英]How to store an abstract templated class with an abstract template type in STL container?
[英]declaring an STL container to store a variable of a template type
我有一个具有成员args
的类,该成员存储一个std::string
和一个std::type_index
。
模板函数setArgument()
将属性的名称及其typeid
到args
。
class OperationEntry:
{
std::vector<std::pair<std::string, std::type_index>> args;
template <class AttrType>
inline OperationEntry& setArgument(const std::string& name)
{
args_.push_back({name, typeid(AttrType)});
return *this;
}
我想将args
的定义扩展为std::tuple
并保留一个附加值,该值将填充在setArgument()
。 但是,值的类型是模板类型AttrType
。
我的问题是我如何声明args
来存储此模板类型,因为我事先不知道该类型?
例如std::vector<std::tuple<std::string, std::type_index, AttrType>> args;
例如setArgument()
可以添加
"alpha", f, 3.3
"beta", i, 3
向量的元素必须具有特定的类型,因此您需要某种类型的擦除。
如果可以实例化setArgument
的类型是真正不受约束的,则需要any
类型。 boost::any
与C ++ 11兼容,当您移至C ++ 17时可以用std::any
代替。
std::vector<std::pair<std::string, std::type_index, boost::any>> args;
如果有有限的类型列表供您选择,则可以改用variant
(在C ++ 17之前使用boost::
在之后使用std::
:)。
std::vector<std::pair<std::string, std::type_index, boost::variant<int, float, string/*, ...*/>>> args;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.