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

Igo*_*kon 14 c++ templates

我上课了

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

有没有办法摆脱模板中的价值?迭代器可能是也可能不是STL迭代器,但它保证*它的类型是Value.

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

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

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

然后,如果我们将Bar实例化为Bar(它,*it),则在Bar中将知道Value的类型.但我找不到将Bar与Foo结合起来的好方法.

Pav*_*aev 18

任何迭代器都应该提供iterator_traits<Iterator>::value_type.如果没有,则它不是迭代器.ISO C++ 2003 24.3.1 [lib.iterator.traits]"迭代器特征":

要仅根据迭代器实现算法,通常需要确定与特定迭代器类型对应的值和差异类型.因此,需要if Iterator是迭代器的类型,类型

iterator_traits<Iterator>::difference_type
iterator_traits<Iterator>::value_type
iterator_traits<Iterator>::iterator_category
Run Code Online (Sandbox Code Playgroud)

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

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