是否可以通过全局变量定义参数数量可变的函数中的参数数量
Is it possible to define the amount of arguments in a function with variable number of arguments by a global variable
我想定义一个参数数量可变的函数,其中这个数量应该由全局变量固定,比如 N
,我想使用 va_list 来实现它。是否可以在不引用参数数量的情况下声明该函数,从而在调用它时不必输入 N
作为第一个变量,而只输入其余的变量?如果没有,除了使用 va_list 之外还有其他方法吗?
现在我只是根据标准方式声明它,在它的定义中我将 N
的值分配给该函数的第一个参数(这样,无论使用哪个整数作为第一个参数,它始终具有所需的值)。有没有更优雅的方式?
不确定你想要什么。
但是,如果您至少可以使用 C++11,并且如果您接受对可变数量的参数使用可变参数模板,我建议使用 SFINAE 强制可变数量的参数是精确的 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
}
max66 是原问题的正确答案:如何拥有可变数量的参数并限制参数数量。
但是,函数参数的数量恰好位于编译时的世界中。您可能想要的是类型为 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});
我想定义一个参数数量可变的函数,其中这个数量应该由全局变量固定,比如 N
,我想使用 va_list 来实现它。是否可以在不引用参数数量的情况下声明该函数,从而在调用它时不必输入 N
作为第一个变量,而只输入其余的变量?如果没有,除了使用 va_list 之外还有其他方法吗?
现在我只是根据标准方式声明它,在它的定义中我将 N
的值分配给该函数的第一个参数(这样,无论使用哪个整数作为第一个参数,它始终具有所需的值)。有没有更优雅的方式?
不确定你想要什么。
但是,如果您至少可以使用 C++11,并且如果您接受对可变数量的参数使用可变参数模板,我建议使用 SFINAE 强制可变数量的参数是精确的 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
}
max66 是原问题的正确答案:如何拥有可变数量的参数并限制参数数量。
但是,函数参数的数量恰好位于编译时的世界中。您可能想要的是类型为 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});