我有一个类,该类具有一个成员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
答案 0 :(得分:0)
向量的元素必须具有特定的类型,因此您需要某种类型擦除。
如果可以实例化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;