在 C++11 中,我们可以使用可变参数模板(Variadic Template)来支持函数模板和类模板中的可变参数。可变参数模板可以接受用户定义数量的参数,并将它们包装在一个参数包中,提供一种灵活的方式处理可变数量的参数。
以下是在函数模板和类模板中如何使用可变参数模板的示例:
在函数模板中使用可变参数模板:
#include <iostream>
// 可变参数模板实现的可变参和函数,打印输入参数
template<typename T, typename... Args>
void print(T value, Args... args)
{
std::cout << value << std::endl;
print(args...);
}
// 当参数包为空时结束可变参和函数
template<typename T>
void print(T value)
{
std::cout << value << std::endl;
}
int main()
{
print(3.14, "hello", 42); // 输出 3.14, hello, 42
return 0;
}
在上面的示例中,我们使用一个可变参数模板函数 print 来打印任意个数的输入参数。print 函数接受任意数量的参数,当参数包中为空时,调用终止函数实现打印过程。
在类模板中使用可变参数模板:
#include <iostream>
// 类模板
template<typename... T>
class Sum
{
public:
static const int value = (0 + ... + T::value); // 使用可折叠表达式来计算参数包中所有成员变量值的和
};
// 整型包装器
template<int N>
struct IntWrapper
{
static const int value = N;
};
int main()
{
// 计算整型包装器值的和
std::cout << Sum<IntWrapper<1>, IntWrapper<2>, IntWrapper<3>>::value << std::endl; // 输出 6
return 0;
}
在上面的示例中,我们定义了一个类模板 Sum,它使用可变参数模板来计算整型包装器的值的和。Sum 类模板中使用可折叠表达式来计算参数包中所有成员变量值的和,其中 0 是初始值,+ 是加法运算符,... 是可折叠表达式语法,T::value 是参数包中整型包装器的值。
总的来说,可变参数模板能够让 C++ 程序员以更加灵活和有效的方式处理可变数量的参数,增强了 C++ 语言的表现力和可维护性。