相关疑难解决方法(0)

丢弃需要输出迭代器的函数的输出

假设C++中有一个模板函数可以完成一些有用的工作,但也可以通过输出迭代器输出一系列值.现在假设这个值序列有时很有趣,但在其他值上没有用.在STL中是否有一个可以实例化的迭代器类,它可以被实例化并传递给函数,并将忽略函数尝试分配给输出迭代器的任何值?换句话说,将所有数据发送到/ dev/null?

c++ iterator stl

20
推荐指数
2
解决办法
1498
查看次数

为什么*_iterator在删除std :: iterator后仍然需要typedef无效?

我使用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只是为了简化标准(库).所以应该有一些我无法弄清楚的原因.

谷歌搜索后,我发现了一个关于堆栈溢出的问题,答案说:

另一方面,将其定义为空白可以防止错误,例如:

typename Iter::value_type v = *it; //useless with an output iterator if …
Run Code Online (Sandbox Code Playgroud)

c++ iterator c++17

5
推荐指数
1
解决办法
171
查看次数

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

我有一个期望模板化迭代器类型的函数.

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

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)来确定任何标准迭代器迭代的对象的大小或类型?

c++ iterator sfinae

4
推荐指数
1
解决办法
168
查看次数

标签 统计

c++ ×3

iterator ×3

c++17 ×1

sfinae ×1

stl ×1