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

时间:2017-12-31 02:25:42

标签: c++

我正在尝试创建一个接受可变数量参数的函数。但我在表达式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;
}

2 个答案:

答案 0 :(得分:1)

函数中的任何内容都不需要

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

答案 1 :(得分: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;
}

您可以看到工作here

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