假设C++中有一个模板函数可以完成一些有用的工作,但也可以通过输出迭代器输出一系列值.现在假设这个值序列有时很有趣,但在其他值上没有用.在STL中是否有一个可以实例化的迭代器类,它可以被实例化并传递给函数,并将忽略函数尝试分配给输出迭代器的任何值?换句话说,将所有数据发送到/ dev/null?
我使用ostreambuf_iterator,如下所示:
在c ++ 17之前,
template< class CharT, class Traits = std::char_traits<CharT> >
class ostreambuf_iterator : public std::iterator<std::output_iterator_tag,
void, void, void, void>
Run Code Online (Sandbox Code Playgroud)
要求我们确定std :: iterator的每个参数类型,因此,对于std::ostreambuf_iterator,void并不是那么糟糕.
我们知道, 在c ++ 17中不推荐使用std :: iterator.因此,迭代器应该在自己的主体中键入它们的成员类型,例如:
Member type Definition
---------------------------------------------
value_type void
difference_type void
pointer void
reference void
iterator_category std::output_iterator_tag
Run Code Online (Sandbox Code Playgroud)
题:
为什么这些void类型仍然是typedefed?我想,我想
Member type Definition
---------------------------------------------
iterator_category std::output_iterator_tag
Run Code Online (Sandbox Code Playgroud)
足够.毕竟,弃用的动机std::iterator只是为了简化标准(库).所以应该有一些我无法弄清楚的原因.
另一方面,将其定义为空白可以防止错误,例如:
Run Code Online (Sandbox Code Playgroud)typename Iter::value_type v = *it; //useless with an output iterator if …
我有一个期望模板化迭代器类型的函数.
它目前取消引用迭代器来检查正在迭代的类型.
template < typename Iterator >
void func( Iterator i )
{
// Inspect the size of the objects being iterated
const size_t type_size = sizeof( *i );
...
}
Run Code Online (Sandbox Code Playgroud)
我最近发现了几种标准的迭代器类型,比如std::insert_iterator定义*i为简单的引用i.
也就是说,sizeof(*i)迭代器本身的大小; 与sizeof(i)或相同sizeof(***i)
有没有通用的方法(支持C++ 03)来确定任何标准迭代器迭代的对象的大小或类型?