是否可以推导出std :: insert_iterator的包含类型?

时间:2012-11-28 18:27:26

标签: c++ iterator sfinae

我有一个需要模板化迭代器类型的函数。

它目前取消引用迭代器来检查正在迭代的类型。

template < typename Iterator >
void func( Iterator i )
{
  // Inspect the size of the objects being iterated
  const size_t type_size = sizeof( *i );

  ...
}

我最近发现一些标准迭代器类型,例如std::insert_iterator*i定义为i的引用。

也就是说,sizeof(*i)是迭代器本身的大小;与sizeof(i)sizeof(***i)

相同

是否有通用方法(支持C ++ 03)来确定任何标准迭代器迭代的对象的大小或类型?

2 个答案:

答案 0 :(得分:5)

这是iterator_traits的用途。

typedef typename std::iterator_traits<Iterator>::value_type type;
const std::size_t type_size = sizeof(type);

编辑:这并不适用于所有输出迭代器。

答案 1 :(得分:2)

我不确定为什么你会想要OutputIterator的value_type,因为无法从Output Iterator中提取值。但是,三个插入迭代器适配器都将value_type定义为void并提供container_type类型成员,因此您可以回退到value_type T::container_type如果value_type的{​​{1}}原来是T

(按“void”我的意思是value_typestd::iterator_traits<T::container_type>::value_type。)

或者您可以尝试使用输出迭代器,就好像它们具有值:)

编辑:SFINAE不是必需的:(即使没有C ++ 11的优点)

std::iterator_traits<T>::value_type