bom*_*bax 1 c++ iterator for-loop c++11
在我的C++ 03代码中,我有很多看起来像这样的函数:
class A {
public:
template <Iterator>
void doSomethingWithObjects(Iterator begin, Iterator end) {
for (Iterator point = begin; point != end; point++) {
mInternal.doSomething(*point);
}
}
private:
DataStructure mInternal;
};
Run Code Online (Sandbox Code Playgroud)
我试图在新代码中尽可能多地使用C++ 11的功能,特别是基于范围的for循环.我的问题是,如何使用模板化迭代器执行此操作?是否有一个神奇的C++结构,它采用两个模板化的迭代器类型,并将它们转换为范围表达式?换句话说,我正在寻找这样的东西:
class A {
public:
template <Iterator>
void doSomethingWithObjects(Iterator begin, Iterator end) {
static_assert(std::is_same<Point, typename std::decay<Iterator>::type>::value, "wrong type mate!"); // extra credit
for (auto&& point : std::magic(begin, end)) {
mInternal.doSomething(point);
}
}
private:
DataStructure mInternal;
};
Run Code Online (Sandbox Code Playgroud)
如果在C++ 11中有一种新的,首选的方法来做这种"为这个结构添加一些对象",我也很满意.
标准库中没有任何内容.Boost有make_iterator_range
一个简化的版本,写得很简单:
template<class Iterator>
struct iter_range {
Iterator begin_, end_;
Iterator begin() const { return begin_; }
Iterator end() const { return end_; }
};
template<class Iterator>
iter_range<Iterator> make_range(Iterator b, Iterator e) { return {b, e}; }
Run Code Online (Sandbox Code Playgroud)
刚问的原始问题push_back
.为此,它不需要循环.只需使用C++ 03范围重载insert
:
mInternal.insert(mInternal.end(), begin, end);
Run Code Online (Sandbox Code Playgroud)