我有一个关于以下答案的问题:
https://stackoverflow.com/a/15828866/2160256
如前所述,我们不能像这样使用基于BGL的范围:
for(auto e : boost::edges(g))
// do something with e但是,这里 it声明,我们可以重载begin()和end()函数,这些函数是使用基于范围的语义所必需的。所以我试着:
template<class I>
I begin(std::pair<I,I>& p)
{ return p.first;}
template<class I>
I end(std::pair<I,I>& p)
{ return p.second;}但是,编译器仍然抱怨:
错误:调用“
begin(std::pair<some_really_ugly_type,some_really_ugly_type>&)”没有匹配函数
我做错了什么?名字查找不起作用吗?还是说这根本不可能?我还找到了这个答案,它可以工作,但它不应该是可能的开始/结束自由函数覆盖以及?你好,玛蒂
顺便说一句:我觉得写东西真的很累人。
typename Graph::edge_iterator ebegin, eend;
std::tie(ebegin,eend) = boost::edges(_graph);
std::for_each(ebegin,eend,[&](const edge_descriptor& e){/*do something with e*/;});更新: C++17现在应该允许以下内容:)
auto [ebegin,eend] = boost::edges(_graph);发布于 2014-11-26 03:29:58
在基于范围的for循环中,非会员begin()和end()的名称查找仅使用ADL .它不执行普通的不合格查找。§6.5.4 Stmt.range/P1.3:
_RangeT是类类型,则在类_RangeT的作用域中查找_unqualified id_s begin和end,就好像通过类成员访问查找(3.4.5)一样,如果其中一种(或两者都)找到至少一种声明,.begin(__range)和end(__range),其中begin和end在关联的命名空间中被查找(3.4.2)。注意:不执行普通的不合格查找(3.4.1)。-end注记因此,找不到您的begin()和end()重载。
发布于 2014-11-26 08:44:19
Iterator对是而不是的设计范围!语言和库规范明确拒绝了这一想法。见A.
如果编写tie()解决方案“觉得很烦人”,只需使用
for (auto& edge : make_iterator_range(boost::edges(_graph)))
/*do something with edge*/;您可以将boost::make_iterator_range命名为更短的东西,但我的编辑器建议在输入mir时将make_iterator_range作为完成。这对我来说已经够快了
当然,那个编辑就是Vim
发布于 2014-11-26 03:36:38
您不能像按照begin()那样拥有免费的end()和T.C.的回答函数。但是,您可以做的就是创建自己的类并将成员begin和end添加到其中:
template <typename I>
struct iter_pair : std::pair<I, I>
{
using std::pair<I, I>::pair;
I begin() { return this->first; }
I end() { return this->second; }
};然后用它代替普通的pair
std::vector<int> v = {1, 2, 3, 4, 5};
iter_pair<decltype(v.begin())> pr{v.begin(), v.end()};
for (int i : pr) {
std::cout << i << ' ';
}
std::cout << std::endl;https://stackoverflow.com/questions/27140778
复制相似问题