c++ - 可变参数模板的无递归扩展到数组访问

标签 c++ c++11 variadic-templates

考虑以下非类型可变参数模板函数:

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/

相关文章:

c++ - 如何在注册表中注册一个类?

c++ - 高效的 const char* 连接和输出到 std::string

c++ - 没有 ExecutionPolicy 的 std::transform 或 std::generate 可以并行吗?

c++ - 如何将多个可变参数模板元组类合并为一个类?

c++ - Windows 8 上的字体变小 - 在 C++/MFC 程序中。如何避免这种情况?

c++ - 从模板化基类中取消隐藏模板化转换运算符

c++ - 函数、数组和动态数组

c++ - 字符串 vector 的高效组合

c++ - 是否可以将一组值传递给可变参数模板声明,类似于斐波那契数列的求解方式

c++ - 对可变参数模板函数的误解