【问题标题】:declaring an STL container to store a variable of a template type声明一个 STL 容器来存储一个模板类型的变量
【发布时间】:2019-04-30 06:40:07
【问题描述】:

我有一个类,它有一个成员 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() 中的附加值。但是类型 value 是模板类型AttrType

我的问题是我如何声明 args 来存储这个模板类型,因为我事先不知道类型'?

例如 - std::vector&lt;std::tuple&lt;std::string, std::type_index, AttrType&gt;&gt; args;

例如setArgument()可以添加

"alpha", f, 3.3
"beta", i, 3

【问题讨论】:

  • 查找std::any
  • 您不能“存储类型”。类型不是对象。你想用这个类型做什么?
  • @StoryTeller 我用一个例子更新了我的问题并修正了一个错字。我不知道如何将std::tuple 中第三个元素的类型声明为setargument() 实例化的类型。
  • 我主要使用 c++ 11 和一些 c++ 14。

标签: c++ templates stl


【解决方案1】:

向量的元素必须具有特定类型,因此您需要某种类型擦除。

如果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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    相关资源
    最近更新 更多