带有非常量参数的 for 循环模板

2 c++ templates c++20

在 cpp 中,您可以使用两个作弊代码来有效地对模板参数进行 for 循环,编译器将接受该循环。如下所示。

#include <iostream>
#include <memory>

template<size_t k> void increment(size_t* v, size_t& i){ v[k]=i*i++; }

int main(){
    const size_t N = 10;
    size_t v[N], i=0;

    // for(size_t k=0;k<N;++k){ increment<k>(v,i); } // this would not work
    
    // so we write the following instead
    [v,i]<std::size_t... Is>(std::index_sequence<k...>){ // this line is the first cheat code
        (increment<k>(v,i), ...); // loop body
    }(std::make_index_sequence<N>{}); // this line is the second cheat code
    
    for(size_t k=0;k<N;++k){ std::cout << v[k] << " , "; }
}
Run Code Online (Sandbox Code Playgroud)

问题:代码无法编译,因为在循环体行中,编译器要求 v,i 为 const。但正如示例所指出的,我不希望它们为常量。因此,我要求提供该作弊代码,以使其发挥作用。如果存在多个作弊代码,我想要最短的。

Fra*_*eux 6

mutable关键字可用于允许 lambda 表达式按值修改 iT 捕获的对象。

您还需要v通过引用捕获或increment将调用副本v并没有可见的效果。

实例: https: //godbolt.org/z/4xbPe4MdP

#include <iostream>
#include <memory>

template<size_t k> void increment(size_t* v, size_t& i){ v[k]=i*i++; }

int main(){
    constexpr std::size_t N = 10;
    std::size_t v[N];

    [&v,i = std::size_t{}]<std::size_t... k>(std::index_sequence<k...>) mutable
    {
        (increment<k>(v,i), ...);
    }(std::make_index_sequence<N>{});
    
    for(std::size_t k=0;k<N;++k){ std::cout << v[k] << " , "; }
}
Run Code Online (Sandbox Code Playgroud)