简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
1.前言
本篇目的:C++之template可变模板参数应用总结。
1.在C++中,template<typename ... Deps>
中的...
是一个可变模板参数(variadic template arguments)语法,用于表示可接受零个或多个类型参数的模板。
2.可变模板参数允许我们在使用模板时传递不确定数量的参数,将其展开为模板的多个实参。这样,我们可以在使用模板时灵活地指定任意数量的类型参数,而不限制于固定数量的参数。
2.应用实例
v1.0 打印任意数量的参数
#include <iostream>template<typename ... Args>
void printValues(Args ... args) {((std::cout << args << " "), ...);
}int main() {printValues(1, "hello", 3.14);// 输出:1 hello 3.14return 0;
}
v2.0 计算可变参数的和
#include <iostream>template<typename ... Args>
auto sumValues(Args ... args) {return (args + ...);
}int main() {int sum = sumValues(1, 2, 3, 4, 5);// 输出:15return 0;
}
v3.0 构造tuple包含不同类型的对象
#include <iostream>
#include <tuple>template<typename ... Args>
auto createTuple(Args ... args) {return std::make_tuple(args...);
}int main() {auto myTuple = createTuple(1, "hello", 3.14);// myTuple 的类型为 std::tuple<int, const char*, double>return 0;
}
v4.0 展开参数并应用函数
#include <iostream>
#include <functional>template<typename ... Args>
void applyFunction(std::function<void(Args...)> fn, Args ... args) {fn(args...);
}void printValues(int a, const std::string& b, double c) {std::cout << a << " " << b << " " << c << std::endl;
}int main() {applyFunction(printValues, 1, "hello", 3.14);// 输出:1 hello 3.14return 0;
}
v5.0 递归展开参数包
#include <iostream>template<typename T>
void processValue(T value) {std::cout << value << " ";
}template<typename T, typename ... Rest>
void processValue(T value, Rest ... rest) {processValue(value);processValue(rest...);
}int main() {processValue(1, "hello", 3.14);// 输出:1 hello 3.14return 0;
}
v6.0 使用可变参数模板作为函数重载
#include <iostream>
#include <string>template<typename T>
void printValue(T value) {std::cout << value << std::endl;
}template<typename T, typename ... Args>
void printValue(T value, Args ... args) {std::cout << value << " ";printValue(args...);
}int main() {printValue(1, "hello", 3.14);// 输出:// 1// hello// 3.14return 0;
}
v7.0 模板递归展开参数包
#include <iostream>template<typename ... Args>
void printValues(Args ... args) {((std::cout << args << " "), ...);
}int main() {std::tuple<int, std::string, double> myTuple(42, "hello", 3.14);std::apply(printValues<Args...>, myTuple);// 输出:42 hello 3.14return 0;
}
v8.0 使用可变参数模板定义类
#include <iostream>template<typename ... Args>
class MyClass {
public:void printValues(Args ... args) {((std::cout << args << " "), ...);}
};int main() {MyClass<int, std::string, double> instance;instance.printValues(42, "hello", 3.14);// 输出:42 hello 3.14return 0;
}