考虑以下非类型可变参数模板函数:
template <typename dummy = void>
void write_at_offsets(volatile char *p) {
}
template <size_t OFF, size_t... OFFs>
void write_at_offsets(volatile char *p) {
p[OFF] = 1;
write_at_offsets<OFFs...>(p);
}
它使用递归的方法在模板参数包中指定的偏移量处写入一个 1。
是否可以在不使用 C++11 中的递归的情况下简洁地编写此代码,例如,一次性展开整个包?
最佳答案
您可以使用 fold 表达式(自 c++17 起),在 index_sequence
中传递偏移量:
template<size_t ... Indices>
void foo(std::index_sequence<Indices...>,volatile char* p){
( (p[Indices] = 1),... );
}
int main(){
char* p = new char[3];
foo(std::index_sequence<0,1,2>(),p);
C++11 使用逗号表达式 (Calculation,0)
创建了由 0 填充的假数组:
template<size_t ... Indices>
void foo(char* p, const int val){
int fake[] = { (p[Indices] = val,0)... };
// cast fake to void to prevent compiler warning present
}
int main(){
char* p = new char[3];
foo<0,1,2>(p,48);
关于c++ - 可变参数模板的无递归扩展到数组访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66254462/