声明一个STL容器来存储模板类型的变量

时间:2018-11-28 11:08:09

标签: c++ templates stl

我有一个类,该类具有一个成员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

1 个答案:

答案 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;