4

boost directory_iterator 示例中-如何列出不递归的目录文件(请参阅此答案)是示例代码

#include <boost/filesystem.hpp>
#include <boost/range/iterator_range.hpp>
#include <iostream>

...
using namespace boost::filesystem;

for(auto& entry : boost::make_iterator_range(directory_iterator(p), {}))
{
    std::cout << entry << "\n";
}

p是类型boost::filesystem::path。)

在查看文档make_iterator_range后,我认为被调用的构造函数是这个:

template< class ForwardTraversalIterator >
    iterator_range< ForwardTraversalIterator >
    make_iterator_range( ForwardTraversalIterator Begin,
                         ForwardTraversalIterator End );

如果我是对的,那么上面代码示例中传递的第二个参数{}, 似乎对应于任何容器的结尾,该容器被directory_iterator.

我以前从未见过这种情况。

是否可以end仅通过从空的初始值设定项列表中构造这样的迭代器来构造迭代器{}?(我的措辞是否正确?)

鉴于如此构造的迭代器的类型必须与第一个迭代器的类型相匹配directory_iterator(p)((这里是否进行模板参数推导?)

4

2 回答 2

3

是的,它是有效的。

除了您通常调用的之外,没有模板参数推导:您的第一个参数是 type directory_iterator,因此该函数被实例化。

接下来,除了模板,现在您正在调用一个需要两个的函数directory_iterators{}只能该点初始化 a directory_iterator,因为这就是您的函数 [模板实例] 所需要的。因此,在这种情况下,写作{}在功能上等同于写作directory_iterator{}

如果directory_iterator无法从 构造{},您的程序将无法编译。

于 2015-07-05T18:09:56.470 回答
1

以下是 的各种重载boost::make_iterator_range

template< class ForwardTraversalIterator >
iterator_range< ForwardTraversalIterator >
make_iterator_range( ForwardTraversalIterator Begin, 
                     ForwardTraversalIterator End );

template< class ForwardRange >
iterator_range< typename range_iterator<ForwardRange>::type >
make_iterator_range( ForwardRange& r );

template< class ForwardRange >
iterator_range< typename range_iterator<const ForwardRange>::type >
make_iterator_range( const ForwardRange& r );

template< class Range >
iterator_range< typename range_iterator<Range>::type >
make_iterator_range( Range& r,
                     typename range_difference<Range>::type advance_begin,
                     typename range_difference<Range>::type advance_end );

template< class Range >
iterator_range< typename range_iterator<const Range>::type >
make_iterator_range( const Range& r, 
                     typename range_difference<const Range>::type advance_begin,
                     typename range_difference<const Range>::type advance_end );

由于您的代码已经指定了第一个参数的类型 directory_iterator,因此第二个参数的唯一有效类型是directory_iterator. 这是明确的。

因此,不需要指定类型。 {}是 的同义词directory_iterator{},这也是 的同义词directory_iterator()

于 2015-07-05T18:06:15.803 回答