C++ 如何在没有前面参数的情况下使用省略号

标签 c++ variadic-functions

嗨 我有一个带有成员函数的类,该函数采用可变数量的参数。该类知道实例化后需要多少个参数。例如

class myClass
{
 myClass(int num_args){na=num_args;};
 private:
 int na;
 public:
 void do_something(int num_args, ...);
}

void myClass::do_something(int num_args, ...)
{
 va_list vl;
 va_start(vl, num_args);
 for(int i=0; i < num_args; i++)
  do_anotherthing(va_arg(vl, type));
 va_end
}

所以我最终调用如下:

myClass A(5);
myClass B(4);

A.do_something(5, a, b, c, d, e);
B.do_something(4, a, b, c, d);

对我来说,必须不断指定我传递的参数数量似乎很不整洁。解决这个问题的最佳方法是什么?我考虑过重载一堆函数,每个函数都有 n 个参数,一个宏来为我放入 num_args 。但理想情况下我希望能够将 do_something 定义为

void do_something(...);

并以某种方式让 stdargs 内容与类的 num_args 一起使用,而不是与传入的值一起使用。

非常感谢您的想法。

最佳答案

请不要这样做。可变数量的参数在 C++ 中非常罕见

实现您想要的效果的最佳方法是创建一个 int 列表并将该列表作为参数传递

您可以检查函数内列表的大小

关于C++ 如何在没有前面参数的情况下使用省略号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5495061/

相关文章:

c++ - 使用 Qt 将应用程序的功能拆分为插件

c - 在 C 中返回 va_list 安全吗?

C++11:Variadic模板函数参数包扩展执行顺序

c++ - 与给定类型相似的最广泛可能类型 - C++

clojure - 如何在 clojure 中处理 java 可变长度参数?

c++ - 如何修复具有不同签名的重载函数

c++ - 为什么 boost::asio::read 缓冲区数据大小小于读取大小?

c++ - 如何将 std::chrono::time_point 转换为 uint64_t?

c++ - 如何检查另一个源字符串中的特定字符串

java - Java 中的 String... args 和 String[] args 之间有什么区别吗?