1

可能重复:
C++ 中的参数数量可变?

我可以不设置具有可变参数数量的函数的参数数量吗?举个例子:下面的接口可以实现吗?

int sum(...) { ... }

sum(1, 2, 3, 4); // return 10
4

5 回答 5

3

传统的可变参数函数很杂乱并且不是类型安全的,但是在C++11中,您可以使用可变参数模板和(编译时)递归干净地做到这一点:

// Base case for recursion
template <typename T>
inline T sum(T n) {
  return n;
}

// Recursive case
template <typename T, typename... Args>
inline T sum(T n, Args... args) {
  return n + sum(args...);
}

由于它是一个模板,这将适用于任何已operator+定义的类型:

std::cout << sum(1, 2, 3) << std::endl;  // Prints 6
std::cout << sum(3.14, 2.72) << std::endl;  // Prints 5.86

但是,由于递归模板函数的返回类型仅取自第一个参数,如果在一次调用中混合不同的参数类型,您会得到令人惊讶的结果: sum(2.5, 2)按预期返回 4.5,但sum(2, 2.5)返回 2 因为返回类型是int,而不是double。如果您想花哨,可以使用新的替代函数语法来指定返回类型是自然类型的任何类型n + sum(args...)

// Recursive case
template <typename T, typename... Args>
inline auto sum(T n, Args... args) -> decltype(n + sum(args...)) {
  return n + sum(args...);
}

现在sum(2.5, 2)sum(2, 2.5)两者都返回 4.5。

如果您的实际逻辑比求和更复杂,并且您不希望它内联,您可以使用内联模板函数将所有值放入某种容器(例如 astd::vectorstd::array)并将其传递给非内联函数在最后做真正的工作。

于 2012-07-17T00:07:30.983 回答
1

您可能希望通过编写函数来获取类似 a 的vector<int>内容,您将使用花括号初始值设定项列表即时构建它:

int sum(std::vector<int> const &n) { 
    return std::accumulate(begin(n), end(n), 0);
}

如果有可能数字可能是(例如)浮点数,您可能希望将其编写为模板:

template <class T>
T sum(std::vector<T> const &n) { 
   return std::accumulate(begin(n), end(n), T());
}

无论哪种方式,您都会稍微不同地调用它:

int x = sum({1,2,3,4});

警告:这个特性是最近才添加到 C++ 中的,所以一些编译器(例如,VC++)还不支持它——尽管其他编译器(例如,g++ 4.7+)支持。

于 2012-07-16T23:21:58.493 回答
0

不,你不能。

只是不要使用可变参数。他们吸收了所有可以想象的时尚,完全不值得任何人花时间。

于 2012-07-16T23:13:39.807 回答
0

C++ 可变参数函数必须知道它传递了多少(以及什么类型)的参数。例如,printf 的格式字符串告诉它期望什么额外的参数。

sum无法知道它是 4 个整数还是 10 个整数。您可以将第一个参数设为长度:

int sum(int howmany, ...) { ... }

所以函数知道后面有多少个整数。但实际上你应该只传递一个数组(或向量,如果你感觉 C++'y)

于 2012-07-16T23:13:52.553 回答
0

有多种方法可以解决您的问题。我会介绍几个:

方法一: - 创建一系列重载求和函数以满足您的需要。

缺点代码膨胀

这可以通过使用标头制作多个函数来实现:

int sum(int a);
int sum(int a, int b);
int sum(int a, int b, int c);

ETC...

方法2:-创建一个带有链表的自定义类,并传入一个指向链表头部的指针。在这种情况下,这可能是您最好的举措,假设您不知道要传入的数据量。

函数头:

int sum(LinkedList *headPointer);

方法3:-传入一个变量数组

函数头:

int sum(int input[]);

方法4:-创建一个带有自动设置变量的函数

函数头:

int sum(int a=0, int b=0, int c=0, int d=0,... int n=0);
于 2012-07-16T23:14:36.267 回答