【发布时间】:2015-04-30 09:45:03
【问题描述】:
是否有等效于 C++ 中 python 的基于范围的enumerate 循环?
我会想象这样的事情。
enumerateLoop (auto counter, auto el, container) {
charges.at(counter) = el[0];
aa.at(counter) = el[1];
}
这可以用模板或宏来完成吗?
我知道我可以只使用老式的 for 循环并进行迭代,直到达到 container.size()。但我很感兴趣如何使用模板或宏来解决这个问题。
编辑
在 cmets 中的提示之后,我使用了 boost 迭代器。我得到了另一个使用 C++14 的可行解决方案。
template <typename... T>
auto zip(const T &... containers) -> boost::iterator_range<boost::zip_iterator<
decltype(boost::make_tuple(std::begin(containers)...))>> {
auto zip_begin =
boost::make_zip_iterator(boost::make_tuple(std::begin(containers)...));
auto zip_end =
boost::make_zip_iterator(boost::make_tuple(std::end(containers)...));
return boost::make_iterator_range(zip_begin, zip_end);
}
template <typename T>
auto enumerate(const T &container) {
return zip(boost::counting_range(0, static_cast<int>(container.size())),
container);
}
【问题讨论】:
-
您想使用模板或 shudders 宏的“老派”循环究竟有什么问题?
-
没什么。我只是想看看它是怎么做到的。