【问题标题】:Is it possible to get the value type from an arbitrary iterator (C++)?是否可以从任意迭代器(C++)中获取值类型?
【发布时间】:2009-07-10 00:36:44
【问题描述】:

我有课

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

有什么办法可以去掉模板中的 Value 吗? Iterator 可能是也可能不是 STL 迭代器,但保证 *it 类型是 Value。

我知道用于 STL 迭代器的 iterator_traits&lt;T&gt;::value_type,但想知道是否有任何方法可以为任意迭代器类型自动获取值类型?

我正在考虑的一个技巧 - 比如说,我们有一个辅助类

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

那么如果我们将 Bar 实例化为 Bar(it, *it),那么在 Bar 内部就会知道 Value 的类型。但是我找不到将 Bar 与 Foo 结合起来的好方法。

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    任何迭代器都应该提供iterator_traits&lt;Iterator&gt;::value_type。如果不是,那么它不是迭代器。 ISO C++ 2003 24.3.1[lib.iterator.traits]“迭代器特征”:

    仅根据术语实现算法 对于迭代器,通常需要 确定价值和差异 对应于特定的类型 迭代器类型。因此,它是 要求如果 Iterator 是类型 迭代器的类型

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

    被定义为迭代器的 差异类型、值类型和 迭代器类别,分别。

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

    【讨论】:

    • 谢谢,参考 ISO C++ 标准很有帮助。
    【解决方案2】:

    对不起。摆脱Value 的正确方法是按照您的建议使用iterator_traits

    如果您的非 STL 迭代器是裸指针,那么您将免费获得正确的 iterator_traits 类型定义。否则非 STL 迭代器类必须定义正确的 typedef。

    请参阅iterator traits documentation 了解更多信息。

    【讨论】:

      【解决方案3】:

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

      但还有更多。您正在考虑的技巧不适用于课堂。如果Bar 是这样的函数:

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

      然后类型推导将适用于bar(it, *it),并且您将在bar 中拥有值类型。 (但请记住,要使用这个技巧,您仍然必须有一个可取消引用的迭代器,这并不总是好的——那么如何处理空序列呢?)

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

      【讨论】:

      • 谢谢!我对使用 bar 作为函数也有同样的想法,但我想也许我错过了一些东西。
      猜你喜欢
      • 2012-08-15
      • 1970-01-01
      • 2013-08-12
      • 2011-03-02
      • 2022-01-10
      • 2021-04-10
      • 2019-09-01
      • 2014-09-26
      • 2013-06-15
      相关资源
      最近更新 更多