C++ 11:由模板化迭代器描述的基于范围的循环范围

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中有一种新的,首选的方法来做这种"为这个结构添加一些对象",我也很满意.

T.C*_*.C. 5

标准库中没有任何内容.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)