我有一个需要模板化迭代器类型的函数。
它目前取消引用迭代器来检查正在迭代的类型。
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)来确定任何标准迭代器迭代的对象的大小或类型?
答案 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_type
和std::iterator_traits<T::container_type>::value_type
。)
或者您可以尝试使用输出迭代器,就好像它们具有值:)
编辑:SFINAE不是必需的:(即使没有C ++ 11的优点)
std::iterator_traits<T>::value_type