如何为循环c ++编写声明14

Del*_*ore 0 c++ range c++17

有没有办法在C++ 14中为循环编写声明式样式

for(int i = 0; i < 10; i+=2) {
    // ... some code
}
Run Code Online (Sandbox Code Playgroud)

我发现最接近的是使用boost

for(auto i : irange(1,10,2)){
     // .... some code
}
Run Code Online (Sandbox Code Playgroud)

是否有c ++ 14/17标准方法可以达到同样的效果?

我试图将std :: make_integer_sequence()作为一个可能的起点,但无法弄明白.

Vit*_*meo 5

没有一种标准的方法可以根据需要迭代数值范围.但是,C++ 14允许您非常轻松地创建自己的实用程序.


方法一:数值范围.

这是一个未经优化的快速黑客攻击示例:

template <typename T>
struct num_range_itr
{
    T _value, _step;

    num_range_itr(T value, T step) 
        : _value{value}, _step{step} 
    {
    }

    auto operator*() const { return _value; }
    auto operator++() { _value += _step; }

    auto operator==(const num_range_itr& rhs) const { return _value == rhs._value; }
    auto operator!=(const num_range_itr& rhs) const { return !(*this == rhs); }
};

template <typename T>
struct num_range
{
    T _start, _end, _step;

    num_range(T start, T end, T step) 
        : _start{start}, _end{end}, _step{step} 
    {
    }

    auto begin() const { return num_range_itr<T>{_start, _step}; }
    auto end() const { return num_range_itr<T>{_end, _step}; }
};

template <typename T>
auto make_range(T start, T end, T step = 1)
{
    return num_range<T>{start, end, step};
}
Run Code Online (Sandbox Code Playgroud)

上面的代码可以使用如下:

for(auto i : make_range(0, 10, 2))
{
    std::cout << i << " ";
}

// Prints: 0 2 4 6 8
Run Code Online (Sandbox Code Playgroud)

方法二:高阶函数.

这是一个未经优化的快速黑客攻击示例:

template <typename T, typename TF>
auto for_range(T start, T end, T step, TF f)
{
    for(auto i = start; i < end; i += step)
    {
        f(i);
    }

    return f;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码可以使用如下:

for_range(0, 10, 2, [](auto i){ std::cout << i << " "; });

// Prints: 0 2 4 6 8
Run Code Online (Sandbox Code Playgroud)

代码可以在wandbox上找到.

如果要在实际项目中使用这些实用程序,则需要仔细编写它们以便安全地支持多种类型,避免无意的签名/未签名转换,避免无效范围,并确保它们得到优化.