对于您的具体示例,您可以将其缩短为以下内容:
int countZeros(int a, int b, int c, int d)
{
return int(a == 0) + int(b == 0) + int(c == 0) + int(d == 0);
}
Live Demo
但是,可变参数模板函数会是更好的选择,然后您可以传入任意数量的参数。
@cigien's answer 向您展示了如何使用在 C++17 中添加的 fold expressions。但是如果你使用 C++11 或 C++14,你仍然可以使用可变参数模板函数,你只需要手动循环参数(参见How can I iterate over a packed variadic template argument list?),例如:
template <typename... Args>
int countZeros(Args... args)
{
int zeros = 0;
for(int i : {args...}) {
zeros += int(i == 0);
}
return zeros;
}
Live Demo
或者:
#include <array>
#include <algorithm>
template <typename... Args>
int countZeros(Args... args)
{
std::array<int, sizeof...(args)> a = {args...};
return std::count_if(a.begin(), a.end(), [](int i){ return (i == 0); });
}
Live Demo
或者:
// for when the template parameter pack is empty...
int doCountZeros() {
return 0;
}
template <typename Arg, typename... Args>
int doCountZeros(Arg firstArg, Args... otherArgs) {
return int(firstArg == 0) + doCountZeros(otherArgs...);
}
template <typename... Args>
int countZeros(Args... args) {
return doCountZeros(args...);
}
Live Demo
这些方法中的任何一种都可以很好地处理您的 countZeros(varA, varB, varC, varD) 示例。
您的示例还显示了 4 个变量的总和。这也可以用函数来处理,例如:
int sum(int a, int b, int c, int d)
{
return a + b + c + d;
}
Live Demo
或者更好,通过可变参数函数。如果你没有使用 C++17 折叠表达式,你可以手动循环参数,类似于上图(另见Add all parameters with parameter pack expansion),例如:
template <typename... Args>
int sum(Args... args)
{
int result = 0;
for(int i : {args...}) {
result += i;
}
return result;
}
Live Demo
或者:
#include <array>
#include <numeric>
template <typename... Args>
int sum(Args... args)
{
std::array<int, sizeof...(args)> a = {args...};
return std::accumulate(a.begin(), a.end(), 0);
}
Live Demo
或者:
int doSum() {
return 0;
}
template <typename Arg, typename... Args>
int doSum(Arg firstArg, Args... otherArgs) {
return firstArg + doSum(otherArgs...);
}
template <typename... Args>
int sum(Args... args) {
return doSum(args...);
}
Live Demo
这些方法中的任何一种都可以让您在需要时使用sum(varA, varB, varC, varD)。