代码之家  ›  专栏  ›  技术社区  ›  Igor Krivokon

是否可以从任意迭代器(C++)中获得值类型?

  •  14
  • Igor Krivokon  · 技术社区  · 15 年前

    我有一节课

    template <typename Iterator, typename Value>
    class Foo {
     public:
      Foo(const Iterator& it) { ... }
      ...
     private:
       map<Value, int> m_;
      }
    };
    

    是否有任何方法可以消除模板中的值?迭代器可以是,也可以不是STL迭代器,但可以保证*it类型是值。

    我知道 iterator_traits<T>::value_type 对于STL迭代器,但想知道是否有任何方法可以自动为任意迭代器类型获取值类型?

    我想的一个诀窍是——比如说,我们有一个助手班

    template <typename Iterator, typename Value>
    class Bar {
     public:
      Bar(const Iterator& dummy_iterator, const Value& dummmy_value) {}
      ...
    };
    

    然后,如果我们将条形实例化为条形(它,*它),则值的类型将在条形内已知。但我找不到一个好方法把酒吧和foo结合起来。

    3 回复  |  直到 15 年前
        1
  •  18
  •   Pavel Minaev    15 年前

    任何 迭代器应该提供 iterator_traits<Iterator>::value_type . 如果没有,那么它就不是迭代器。ISO C++ 2003 24.3.1[LII.迭代器.性状]“迭代器特征”:

    仅从以下方面实现算法 对于迭代器,通常需要 确定价值和差异 与特定类型对应的类型 迭代器类型。因此,它是 要求如果 Iterator 是类型 对于迭代器,类型

    iterator_traits<Iterator>::difference_type
    iterator_traits<Iterator>::value_type
    iterator_traits<Iterator>::iterator_category
    

    定义为迭代器 差分类型、值类型和 迭代器类别。

    除此之外,没有一种通用的方法来获得任意类型的C++表达式。C++0X将通过提供纠正 decltype .

        2
  •  1
  •   Jon-Eric    15 年前

    对不起的。正确的摆脱方法 Value 是使用 iterator_traits 如你所建议的。

    如果您的非STL迭代器是一个裸指针,那么您可以免费获得正确的迭代器特性typedef。否则,非STL迭代器类必须定义正确的typedef。

    iterator traits documentation 更多信息。

        3
  •  1
  •   Adam Badura    15 年前

    关于获取迭代器的值类型,以前的答案是正确的。

    但还有更多。你所想到的技巧在课堂上是行不通的。如果 Bar 是一种功能,比如:

    template <typename Iterator, typename Value>
    void bar(const Iterator& dummy_iterator, const Value& dummmy_value) {}
    

    那么,类型扣除将适用于 bar(it, *it) 您可以在 bar . (但请记住,要使用这个技巧,您仍然需要有一个不总是好的解引用迭代器-那么如何处理空序列?)

    使用类 酒吧 您必须提供模板参数 Iterator Value 手动,因为类和使用没有类型推导 Bar(it, *it) 无法编译。