现代C++中的可变参数模板是C++11引入的一个功能,允许模板接受可变数量的参数,使得模板编程更加灵活和强大。
1. 基本用法
可变参数模板允许您创建接受任意数量参数的函数或类模板。
template<typename... Args>
void func(Args... args) {
// 处理参数
}
func(1, 2, 3, 4);
2. 递归展开参数
可变参数模板通常通过递归方式处理参数列表。递归的终止条件通常是一个专门的函数重载。
template<typename T>
void print(T t) {
std::cout << t << std::endl; // 终止条件的处理
}
template<typename T, typename... Args>
void print(T t, Args... args) {
std::cout << t << ", ";
print(args...); // 递归调用
}
print(1, 2, 3, "hello", 5.5);
3. 类模板中的应用
可变参数模板也可以用在类模板中,提供了极大的灵活性。
template<typename... Mixins>
class MyClass : public Mixins... {
public:
MyClass(const Mixins&... mixins) : Mixins(mixins)... {}
// 类成员
};
class Mixin1 {};
class Mixin2 {};
MyClass<Mixin1, Mixin2> myClass(Mixin1(), Mixin2());
4. 使用std::tuple
处理参数
std::tuple
是与可变参数模板结合得非常好的一个标准库类型,允许您存储和操作一个异构的值序列。
template<typename... Args>
void tupleFunc(const std::tuple<Args...>& t) {
// 使用std::tuple处理参数
}
std::tuple<int, double, std::string> t = std::make_tuple(1, 2.0, "hello");
tupleFunc(t);
5. 与std::forward
结合使用
在涉及到完美转发的情况下,variadic templates可以与std::forward
结合使用,以保持参数的左值/右值属性。
template<typename F, typename... Args>
void forwardFunc(F f, Args&&... args) {
f(std::forward<Args>(args)...);
}
void exampleFunc(int& x, double&& y) {
std::cout << x << ", " << y << std::endl;
}
int i = 10;
forwardFunc(exampleFunc, i, 2.0);