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;
}

 

posted on 2022-05-23 22:11  蜀山菜鸟  阅读(143)  评论(0)    收藏  举报