【发布时间】:2021-11-18 03:32:01
【问题描述】:
所以基本上,我想创建一个这样的函数:
total_sum(1, 2, 5, 4, 2) // return 14
total_sum(5, 6, 2) // return 13
我可以使用的一种方法是省略号,如下所示:
#include <cstdarg>
int total_sum(int count, ...)
{
int sum{0};
va_list list;
va_start(list, count);
for (int arg{0}; arg < count; ++arg)
{
sum += va_arg(list, int);
}
va_end(list);
return sum;
}
但是当我调用total_sum() 时,我必须提供一个额外的参数。所以在示例中,我必须调用:
total_sum(5, 1, 2, 5, 4, 2);
total_sum(3, 5, 6, 2);
我不太喜欢。另外,省略号真的很容易出错,所以我想远离它们。
我能想到的另一种方法是使用一些容器:
#include <vector>
int total_sum(std::vector<int> values)
{
int sum{0};
for(const auto &i : values)
{
sum += i;
}
return sum;
}
我这样称呼它:
total_sum({1, 2, 5, 4, 2});
total_sum({3, 5, 6, 2});
但是,我不想有那些花括号,那我该怎么办?是否有一些 C++ 功能允许我这样做?
一些相关链接:restrict variadic template arguments、fold expression、parameter packs和a C++11 "equivalent" of fold expressions
【问题讨论】:
-
您可以使用宏为您的
total_sum函数提供计数。像这样的东西:stackoverflow.com/a/2124433/11613622 -
如果参数个数有最大值,可以使用可选参数-每个参数的默认值-,如果你发送一个值它会使用它,否则它是默认值分配给。例如默认值为 0,它对求和运算没有任何影响
标签: c++