4

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

它当前取消引用迭代器以检查被迭代的类型。

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定义*ii.

即,sizeof(*i)是迭代器本身的大小;相同sizeof(i)sizeof(***i)

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

4

2 回答 2

4

这就是iterator_traits它们的用途。

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

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

于 2012-11-28T18:28:48.913 回答
2

我不确定你为什么想要value_type一个 OutputIterator,因为没有办法从 Output Iterator 中提取一个值。但是,三个插入迭代器适配器都定义value_type为 bevoid并提供一个类型成员,因此如果of变成了container_type,您可以回退到value_typeof 。T::container_typevalue_typeTvoid

(通过“value_type的”我真的是指std::iterator_traits<T::container_type>::value_typestd::iterator_traits<T>::value_type。)

或者你不能尝试使用输出迭代器,就好像它们有值一样:)

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

template<typename U, typename T> struct helper {typedef U type;};

// ostream*_iterator handling courtesy Drew Dormann
template <typename T, typename charT, typename traits>
struct helper<void, std::ostream_iterator<T, charT, traits> > {typedef T type;};

template <typename charT, typename traits>
struct helper<void, std::ostreambuf_iterator<charT, traits> > {typedef charT type;};

// std::raw_storage_iterator still needs an override
// as well as any non-standard output iterators which don't define a container_type.

template<typename T> struct helper<void, T>
{typedef typename std::iterator_traits<typename T::container_type>::value_type type;};

typedef<typename It> struct my_value_type
  : public helper<typename std::iterator_traits<It>::value_type, It> {}; 
于 2012-11-28T19:28:07.363 回答