-
任意个数、任意类别的模板参数
template<typename... Ts> class Magic; // 计算参数的个数 template<typename... Ts> void magic(Ts... args) { std::cout << sizeof...(args) << std::endl; }
-
递归解包:
- C++17 之前
template<typename T0> void my_printf(T0 value) { std::cout << value << std::endl; } template<typename T, typename... Ts> void my_printf(T value, Ts... args) { std::cout << value << std::endl; my_printf(args...); } int main() { my_printf(1, 2.2, "abc", 'a'); return 0; }
- C++17 变参模板展开:
template<typename T, typename... Ts> void my_printf(T t, Ts... ts) { std::cout << t << std::endl; if constexpr (sizeof...(ts) > 0) my_printf(ts...); } int main() { my_printf(1, 1.2f, 3.4, 'a'); }
-
C++17 之前初始化列表展开:
template <typename... Ts> void my_printf1(Ts... msg) { // 利用数组初始化 using var = int[]; (void)var{0, (std::cout << msg << std::endl, 0)...}; } template <typename... Ts> void my_printf2(Ts... msg) { // 利用 initializer_list (void)initializer_list<int>{(std::cout << msg << std::endl, 0)...}; }
-
C++17 折叠表达式:
template<typename... Ts> void my_printf(Ts ... ts) { ((std::cout << ts << std::endl), ...); }