c ++函数具有变量和未知数量的参数

时间:2012-07-16 23:07:11

标签: c++ function

  

可能重复:
  Variable number of arguments in C++?

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

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

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

5 个答案:

答案 0 :(得分:3)

传统的variadic functions非常混乱且不是类型安全的,但在C++11中,您可以使用variadic templates和(编译时)递归来干净地执行此操作:

// 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,但是{{ 1}}返回2,因为返回类型为sum(2, 2.5),而不是int。如果您想要花哨,可以使用新的alternative function syntax来指定返回类型是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)都返回4.5。

如果您的实际逻辑比求和更复杂,并且您不希望它内联,则可以使用内联模板函数将所有值放入某种容器中(例如sum(2, 2.5)或{ {1}})并将其传递给非内联函数,以便在最后完成实际工作。

答案 1 :(得分:1)

您可能希望通过编写函数来执行此操作,以使用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+)也支持它。

答案 2 :(得分:0)

不,你不能。

只是不要使用变量参数。他们以任何可以想象的方式吮吸,完全不值得任何人的时间。

答案 3 :(得分:0)

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

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

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

所以函数知道跟随多少个int。但实际上你应该传递一个数组(或者如果你感觉C ++那么向量)

答案 4 :(得分:0)

有多种方法可以解决您的问题。我会过几点:

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

缺点 - 代码膨胀

这可以通过使用标题创建多个函数来实现:

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

等...

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

功能标题:

int sum(LinkedList *headPointer);

方法3: -pass in变量数组

功能标题:

int sum(int input[]);

方法4: - 使用自动设置变量创建一个函数

功能标题:

int sum(int a=0, int b=0, int c=0, int d=0,... int n=0);