陳 力*_*陳 力 5 c++ iterator c++17
我使用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 it compiled
但我想如果我们不输入typedef value_type,也可以防止这样的错误.
因为ISO C++ 17一般std::iteartor_traits需要所有这5种成员类型,即使它自C++ 17以来已经是SFINAE友好的.如果嵌套类型不足,则实例std::iterator_traits将没有所需的成员.目前,目前的草案没有改变.
另请参阅iterator_traits SFINAE友好性,了解原始提案的基本原理.
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |