c++模版元编程-可变参数模版
在 C++ 中,我们可以使用模板参数包(Template Parameter Pack)和展开表达式(Expanding Expression)来定义可变参数模板。
模板参数包
模板参数包是一种特殊的语法,用于表示接受多个模板类型参数或非类型参数的情况。模板参数包以三个连续的点号 ...
表示,并放置在模板参数列表的末尾。
template<typename... Args>
void myFunction(Args... args) {// 使用 Args... 处理参数
}
在上面的代码中,Args
是一个模板参数包,它可以表示零个或多个模板类型参数。args
是函数的参数包,在函数体内可以使用 args...
来展开参数包。
展开表达式
展开表达式是用于在编译时展开模板参数包的一种机制。我们可以使用展开表达式来逐个处理参数包中的参数。
template<typename... Args>
void myFunction(Args... args) {(doSomething(args), ...); // 使用逗号表达式展开参数包
}
在上面的代码中,(doSomething(args), ...)
这个表达式使用逗号表达式和省略号 ...
将参数包中的每个参数传递给 doSomething
函数。逗号表达式的结果是最后一个子表达式的结果,因此整个表达式的结果是最后一个 doSomething
函数的返回值。
如何使用可变参数模板?
使用可变参数模板时,我们可以根据实际需求来设计函数或类模板的接口。以下是几个示例:
可变参数函数模板
#include <iostream>// 可变参数函数模板:求和
template<typename... Args>
auto sum(Args... args) {return (args + ...);
}int main() {std::cout << sum(1, 2, 3, 4, 5) << std::endl; // 输出:15return 0;
}
在上面的代码中,我们定义了一个可变参数函数模板 sum
,用于计算任意数量参数的和。在 main
函数中,我们调用了 sum
函数并传入了一组整数参数,然后打印求和的结果。
可变参数类模板
#include <iostream>// 可变参数类模板:打印参数
template<typename... Args>
class Printer {
public:void print(Args... args) {(std::cout << ... << args) << std::endl;}
};int main() {Printer<int, double, std::string> printer;printer.print(42, 3.14, "Hello World"); // 输出:42 3.14 Hello Worldreturn 0;
}