问题标签 [variadic]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
62235 浏览

r - 编写自己的函数时如何使用 R 的省略号功能?

R 语言有一个很好的特性来定义可以接受可变数量参数的函数。例如,该函数data.frame采用任意数量的参数,每个参数成为结果数据表中一列的数据。示例用法:

该函数的签名包括一个省略号,如下所示:

我想编写一个执行类似操作的函数,获取多个值并将它们合并为一个返回值(以及进行一些其他处理)。为了做到这一点,我需要弄清楚如何...从函数内的函数参数中“解包”。我不知道该怎么做。函数定义中的相关行data.frameobject <- as.list(substitute(list(...)))[-1L],我无法理解。

那么如何将函数签名中的省略号转换为例如列表?

更具体地说,我如何get_list_from_ellipsis在下面的代码中编写?


编辑

似乎有两种可能的方法可以做到这一点。它们是as.list(substitute(list(...)))[-1L]list(...)。但是,这两个做的事情并不完全相同。(有关差异,请参阅答案中的示例。)谁能告诉我它们之间的实际区别是什么,我应该使用哪一个?

0 投票
1 回答
504 浏览

c++ - C++0x 将参数传递给可变参数模板函数

通过引用获取可变数量的参数是什么意思?这是否意味着每个参数都是通过引用传递的?

例如,考虑以下对每个参数执行一些处理的函数:

现在,如果我有:

这会导致 f(int&, int&, int&)、f(int&, int&) 和最后 f(int&) 的实例化吗?

如果我将 f() 的第二个参数更改为“Tail...”而不是“Tail&...”,怎么样?现在实例化是 f(int&, int, int), f(int&, int),最后是 f(int&),这意味着例如“c”将通过前两个调用复制,最后一个调用将修改 a复制而不是原件?

有人可以指出一个很好的参考来解释可变参数模板的工作原理吗?

0 投票
3 回答
2705 浏览

c - `-pedantic` 生成的编译器警告是什么意思?

这个 GCC 警告是什么意思?

相关线路是:

最后一行是函数实现中的第 232 行。编译器标志是:

0 投票
2 回答
2233 浏览

c++ - 使用可变参数模板解决 C++ 中的 mixin 构造函数问题

我最近解决了构造函数问题,其中相互装饰的各种混合类(以及最顶层的宿主类)具有不同的构造函数签名。为了在生成的装饰类中维护单个构造函数,并且不添加初始化函数,我找到了以下解决方案。它对 mixin 类的唯一限制是,如果它的构造函数接受多个参数,则它们都应该封装在一个元组中。(使用 g++ 编译此代码需要 -std=c++0x 标志)

我的问题是:
1) 有没有更好、更优雅的方法来用 C++0X 解决这个问题?
2)具体来说,元组真的有必要吗?

0 投票
5 回答
1331 浏览

c - 使用 stdargs (va_start) 的 C 程序的奇怪行为 (SEGFAULT)

我编写了一个可变参数 C 函数,其任务是为缓冲区分配所需的内存,然后在该缓冲区中 sprintf 给该函数的参数。但我看到它有一种奇怪的行为。它只工作一次。如果我对此函数有两次调用,则会出现段错误。

这是这个程序的输出:

难道我做错了什么?我不应该va_start在一个函数中多次使用吗?你有其他选择吗?非常感谢!:)

0 投票
1 回答
586 浏览

c++ - c++0x 元组是否使用新的可变参数模板或 Boost 的宏元组实现?

我读到它是基于Boost 的版本,但我不太确定它在实施时意味着什么。我知道 Boost 有自己的可变参数模板,但我认为 c++0x 会为新元组使用自己的可变参数模板。

0 投票
1 回答
417 浏览

c++ - 消除可变类层次结构中的无参数函数调用的歧义

我试图为从可变参数层次结构(下面的 ObjGetter)派生的类(下面的 MyGizmo)的用户提供一种简单、整洁的方式来明确调用不带参数的成员函数(下面的 check())。我可以使用带参数的函数(例如下面的 tune())来实现这一点,但我还没有找到一种方法让它适用于不带参数的函数。

我尝试了以下方法,但并不完全满意:

首先,我可以使用在层次结构中携带的二级简单模板类,以减少只有一个模板 arg 的丑陋调用;产生类似的东西:

我可以使用 Type2Type 助手并给 check() 一个参数,这很好用,看起来像这样:

我可以使用宏,但我不想去那里......

我认为模板别名将提供一个解决方案,但我使用的 g++ 尚不支持它们。这期间还有什么事情吗?非常感谢!

0 投票
2 回答
140 浏览

c++ - 具有 3 个术语的可变参数宏

我试图理解显式读取 dll 的 C++ 代码。有谁知道#define LFE_API(name) LFE_##name name下面的行实际上是如何工作的?我理解#define LFE_API(name) LFE_##name但对最后一个“名字”感到困惑。

0 投票
1 回答
8640 浏览

macros - C99 中具有 0 个参数的可变参数宏

我有一些调试代码,如下所示:

使用了最后一个宏,因此我可以将该位置插入到调试输出中,以了解错误发生的位置。但是,当我这样调用函数时:

我希望的代码是 C99,所以我发现当它编译时,我收到以下错误:

我知道我可以通过将调用更改为

但是有什么办法可以让这看起来不那么难看吗?谢谢!

0 投票
4 回答
1984 浏览

c++ - 参数仅由省略号不同的函数重载

我有这个日志记录系统,我正在寻找一些字符串操作的快捷方式。

日志系统通过功能宏使用,然后转发到单个函数调用。例如#define Warning(...) LogMessage(eWarning, __VA_ARGS__);

然后 LogMessagesnprintf进入一个新的缓冲区,然后将该消息呈现给碰巧安装的任何日志目标;printf、OutputDebugString 等

不幸的是,我遇到了一个问题,我们拥有的缓冲区不够大,因此输出被截断。我还意识到,如果输出消息中包含百分比符号,此方法将失败,因为 snprintf 将尝试处理 va_args。最后,由于我们的大多数日志消息不使用 va_args,复制字符串只是为了将其呈现给记录器似乎很愚蠢。

所以-给定我的函数原型,我是否应该能够根据省略号的存在来重载?换句话说,我是否应该能够假设我可以做类似的事情:

我的谷歌尝试并没有产生任何特别有用的东西(只是告诉我,如果没有其他方法,椭圆将匹配,与我的要求不同,没有任何匹配),我最初的实现只是给了我一个模棱两可的函数调用错误。

有了这个错误,我应该接受我不能这样做,但我想知道这只是我正在使用的编译器,还是我做错了。我可以达到类似的效果

...但这在典型情况下似乎很浪费,只需通过传递的参数数量即可知道。例如,如果省略号不匹配任何内容,请选择其他函数?如果这不起作用,我可以尝试另一种方法,不需要用户用宏名称来决定将调用哪个函数?老实说,一旦我意识到如果有人Error("Buffer not 100% full");在他们的日志消息中随意说出并得到“缓冲区不是 1007.732873e10ull”,那么“浪费”就不再那么重要了。

编辑:虽然我的例子已经回答了“不要那样做”,但问题本身可以回答吗?