在 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。但正如示例所指出的,我不希望它们为常量。因此,我要求提供该作弊代码,以使其发挥作用。如果存在多个作弊代码,我想要最短的。
该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)