【问题标题】:How to get the type of stl container from object?如何从对象中获取 stl 容器的类型?
【发布时间】:2013-03-21 14:45:30
【问题描述】:

如何从对象中获取 STL 容器的类型?例如,我有一个container 变量,我知道它是std::vector<some type>。我需要使用迭代器迭代容器。有没有办法在不知道容器类型的情况下声明迭代器?

我当然可以从代码中获取类型,但我很想在不使用类型的情况下做到这一点。我也没有使用 C++11。

【问题讨论】:

  • 你能展示一些你使用“某种类型”的std::vector 的代码吗?
  • 您能否展示一些代码来说明您遇到的问题。如果您有一个接受container 作为参数的函数,则必须包含该类型——除非它是一个模板,但即使在这种情况下,您也可以使用 SFINAE 来获取您需要的内容。
  • 编译器知道容器的类型,你为什么不知道?
  • container 变量是模板参数吗?这就是你不知道具体类型的原因吗?
  • 这就是为什么auto被添加到C++11!

标签: c++ stl


【解决方案1】:

C++11 有一些不错的简单方法:

auto it = container.begin();

或等效:

decltype(container.begin()) it = container.begin();

甚至:

decltype(container)::iterator it = container.begin();

尽管如此,即使您不能使用类型推导,您也不应该处于无法以某种形式输入类型的情况(可能涉及模板参数)。如果编译器知道它是什么类型,那么你也知道。

【讨论】:

    【解决方案2】:
    typedef std::vector<some_type> container;
    
    for(container::const_iterator i = container.begin(); i != container.end(); ++i)
        // ... 
    

    你也有迭代器 typedef(你可以用它来代替 const_iterator)。如果您使用的是 c++11,请使用 auto 或 for(auto&amp; value: container) { ... } 表单。

    【讨论】:

    • 这并不能真正回答问题,但通常是这样解决问题的。
    【解决方案3】:

    从类型中获取它:

    container::value_type.
    

    对于关联容器; container::mapped_type(container::value_type 对应对)。符合 C++ 标准第 23 章。

    使用boost::is_same 比较类型

    从对象实例中获取:

    auto it = container.begin();
    

    【讨论】:

    • 来自容器的一个实例。
    • 啊,好的,我明白了,从对象实例,好的
    【解决方案4】:

    一种方法是使用模板:

    template <class container>
    void dosomething(container &c) { 
        typename container::iterator it = c.begin();
        typename container::iterator end = c.end();
    
        while (it != end) 
           dosomething_with(*it);
    }
    

    根据情况,auto 也可能有用:

    for (auto it = container.begin(); it != container.end(); ++it)
        dosomething_with(*it);
    

    后者需要 C++11,但前者在 C++98/03 中可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-05
      • 2011-03-02
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      相关资源
      最近更新 更多