将可变长度参数传递给函数C++

Passing variable length argument to function C++

本文关键字:函数 C++ 参数传递      更新时间:2023-10-16

我正在尝试创建一个接受可变数量参数的函数。但是我在表达decltype(std::initializer_list::size_type) res1=0;时遇到错误,因为error: expected primary-expression before 'decltype'. 目的是声明可以保存列表总和的适当变量类型(尽管此声明将创建足够大的变量来仅保存列表的所有元素,而不是它们的总和(。我该怎么做?

另外,如何使适当的函数返回类型以返回res1而不是void

#include <iostream>
#include <initializer_list>
void sum1(std::initializer_list<int> lst1)
{
    decltype(std::initializer_list::size_type) res1=0;
    for(auto v1:lst1)
    {
        res1 += v1;
    }
    std::cout<<" sum = n"<<res1;
}
int main()
{
    sum1({1,2,3,4,5,6,7,8,9,10});
    //auto b = sum1({1,2,3,4,5,6,7,8,9,10});
    return 0;
}
函数

中的任何内容都不需要size_typeinitializer_list的类型为 int,因此res1应该是一个int,并且您的返回类型应该是 int 。如果您确实想从initializer_list派生值类型,请这样做:

#include <iostream>
#include <initializer_list>
auto sum1(std::initializer_list<int> lst1)
{
    typename std::initializer_list<int>::value_type res1 = 0;
    for(auto v1:lst1)
    {
        res1 += v1;
    }
    return res1;
}
int main()
{
    sum1({1,2,3,4,5,6,7,8,9,10});
    auto b = sum1({1,2,3,4,5,6,7,8,9,10});
    std::cout << b << std::endl;
    return 0;
}

如果您希望函数是泛型的,在这种情况下,需要派生值类型,则模板函数如下所示。

#include <iostream>
#include <initializer_list>
template<typename T>
auto sum1(std::initializer_list<T> lst1)
{
    typename std::initializer_list<T>::value_type res1 = 0;
    for(auto v1:lst1)
    {
        res1 += v1;
    }
    return res1;
}
int main()
{
    sum1({1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.10});
    auto b = sum1({1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.10});
    std::cout << b << std::endl;
    return 0;
}

以下是更正的代码。

#include <iostream>
#include <initializer_list>
int sum1(std::initializer_list<int> lst1)
{
    int res1=0;
    for(auto v1:lst1)
    {
        res1 += v1;
    }
    return res1;
}
int main()
{
    std::cout<<" sum = "<<sum1({1,2,3,4,5,6,7,8,9,10});
    //auto b = sum1({1,2,3,4,5,6,7,8,9,10});
    return 0;
}

您可以在此处查看工作。

注: 如果结果不在 int 的限制范围内,则可以将res0类型更改为long或其他类型。此外,相应地更改函数sum1的返回类型。