是否可以通过全局变量定义具有可变数量参数的函数中的参数数量

时间:2018-01-25 18:38:00

标签: c++ variadic-functions

我想定义一个具有可变数量参数的函数,其中这个数量应该由全局变量修复,比如N,我想用va_list来实现它。是否可以在不引用参数数量的情况下声明该函数,因此在调用它时不必输入N作为第一个变量,而只需要输入其余变量?如果没有,除了使用va_list之外还有其他办法吗?

现在我只是按照标准方式声明它,并在其定义中将N的值赋给该函数的第一个参数(这样,无论使用哪个整数作为第一个参数,它总是具有所需的价值)。有更优雅的方式吗?

2 个答案:

答案 0 :(得分:1)

不确定你想要什么。

但是如果你至少可以使用C ++ 11,并且如果你接受使用可变参数模板作为可变数量的参数,我建议使用SFINAE来强制变量数量的参数是exaclty N

以下是一个完整的工作示例

#include <type_traits>

static constexpr std::size_t N = 3U;

template <typename ... Args>
typename std::enable_if<N == sizeof...(Args), int>::type foo (Args ... as)
 { return 0; }

int main ()
 {
   //foo(0, 1);       // compilation error
   foo(0, 1, 2);    // compile
   //foo(0, 1, 2, 3); // compilation error
 }

答案 1 :(得分:1)

max66&#39; s是原始问题的正确答案:如何获得可变数量的参数并限制参数的数量。

但是,函数参数的数量完全在编译时间的世界中。你可能想要的是std::vector类型的参数。 std::vector包含可变数量的相同类型的值。如果你想在运行时设置该长度应该始终是什么,那么你可能想检查长度并在错误的情况下抛出异常。

size_t N__ = 4;

int sum(const std::vector<int>& vec) {
  if (vec.size() != N__) { throw std::length_error("error message"); }
  int out = 0;
  for (int i_ : vec) { out += i_; }
  return out;
}

然后你可以用

来调用它
const int just_ten = sum({1, 2, 3, 4});