C++

C++ 知识量:19 - 82 - 316

16.3 可变参数模板><

可变参数函数模板- 16.3.1 -

C++中的函数模板可以接受可变数量的参数。这可以通过在模板参数列表中使用省略号(...)来表示。这种函数模板被称为可变参数函数模板。

下面是一个简单的可变参数函数模板的例子,它可以接受任意数量的整数参数,并将它们打印出来:

#include <iostream>  
  
template<typename T, typename... Args>  
void print(T value, Args... args) {  
    std::cout << value << " ";  
    print(args...);  // 递归调用,打印剩余参数  
}  
  
int main() {  
    print(1, 2, 3, 4, 5);  // 输出:1 2 3 4 5  
    return 0;  
}

在上面的代码中,print函数模板接受一个必须参数T和可变数量的参数Args。在函数体中,首先打印出第一个参数,然后递归调用print函数模板,将剩余的参数作为新的参数列表。这样,所有的参数都会被打印出来。

需要注意的是,可变参数函数模板的最后一个参数必须是可变参数列表的第一个参数。在上面的例子中,最后一个参数是args...。

包扩展- 16.3.2 -

在 C++ 中,参数包(Parameter Pack)是一个可以包含任意数量和类型参数的模板参数列表。参数包可以用于扩展函数模板的适用范围,使得函数可以接受任意数量和类型的参数。

扩展一个参数包时,需要提供一个模式(pattern),该模式定义了如何对参数包中的每个元素进行操作。扩展操作会将参数包分解为构成的元素,并对每个元素应用模式,从而获得扩展后的列表。

在 C++ 中,使用省略号(...)来表示参数包,并在模式右边放置省略号来触发扩展操作。例如,下面是一个简单的示例:

template<typename... Args>  
void foo(Args... args) {  
    // 扩展参数包 args,并对每个元素应用模式 ...args  
    // 扩展后的列表将作为函数 foo 的参数  
    // 在这里可以对每个扩展后的元素进行操作  
}

在上面的示例中,Args 是一个参数包,它可以包含任意数量和类型的参数。args 是该参数包的实例,可以传递任意数量和类型的参数给函数 foo。在函数体中,可以使用扩展操作来处理参数包 args,例如打印每个参数的值:

template<typename... Args>  
void foo(Args... args) {  
    // 扩展参数包 args,并对每个元素应用模式 ...args  
    ((std::cout << args << std::endl), ...);  
}

在上面的示例中,使用折叠表达式 (...args) 来对参数包 args 进行扩展,并对每个元素应用模式 args。在这个例子中,模式是一个逗号表达式 ,,它用于连接打印每个参数的语句。通过这种方式,可以打印出所有传递给函数 foo 的参数的值。