c++变长参数的应用
c++变长参数应用示例:
// C++中C11提供了任意类别的安全的变长参数函数模板(C11之前模板函数参数个数只能固定),使用方法如下: // template<typename... Args> void Func(Args... args); template <typename... ArgsList> void TestArgsCout(ArgsList... args) { std::cout << sizeof...(args) << std::endl; } TEST(VariableLengthArgs, t0) { TestArgsCout(1, 2, 3, 4, 5, 6, 7); } // 解析参数 递归 template<typename T> void ParseArgs(T value) { cout << value << endl; } template<typename T, typename... Ts> void ParseArgs(T value, Ts... args) { std::cout << value << std::endl; // 这里当args递归到最后1个参数时,会调用上面那个固定1个参数的模板函数ParseArgs ParseArgs(args...); } TEST(VariableLengthArgs, ParseArgs) { ParseArgs(1, 2, 5.1, 6); } // 解析参数 初始化列表 template<typename T, typename... Ts> void ParseParamInitalizer(T value, Ts... args) { std::cout << value << std::endl; (void) std::initializer_list<T>{([&args] { std::cout << args << std::endl; }(), value)...}; } TEST(VariableLengthArgs, ParseParamInitalizer) { ParseParamInitalizer(1, 2, 5.1, 6); } // c++17及以上 模板展开 template<typename T, typename... Ts> void ParseParamEasy(T value, Ts... args) { std::cout << value << std::endl; if constexpr (sizeof...(args) > 0) ParseParamEasy(args...); } TEST(VariableLengthArgs, ParseParamEasy) { ParseParamEasy(1, 2, 5.1, 6); } // 简单应用,求和 template<typename ... T> auto AddNum(T ... t) { return (t + ...); } TEST(VariableLengthArgs, AddNum) { auto count = AddNum(1, 2, 5.1, 6); cout << "count = " << count << endl; }
浙公网安备 33010602011771号