1. 任意个数、任意类别的模板参数

    template<typename... Ts> 
    class Magic;
    
    // 计算参数的个数
    template<typename... Ts>
    void magic(Ts... args) {
        std::cout << sizeof...(args) << std::endl;
    }
    
  2. 递归解包:

    • 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');
    }
    
  3. 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)...};
    }
    
  4. C++17 折叠表达式

    template<typename... Ts>
    void my_printf(Ts ... ts) {
        ((std::cout << ts << std::endl), ...);
    }