问题标签 [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.
sql - 在 plpgsql 中,如何使用可变数量的标识符创建和执行命令字符串?
在 postgres 9.1 中,我想创建一个函数,它接受一个索引名称、一个表名称和可变数量的列,构造一个索引,然后做一些其他的事情。
我目前的方法是使用 plpgsql 并构造一个动态命令来执行。quote_ident
但是,当我试图用来保护所有标识符时,我被绊倒了。到目前为止的代码:
传递一个列名时,代码似乎是成功的,但有两个或更多时,我收到以下错误:
我究竟做错了什么?(大概是format
我使用或使用的东西VARIADIC
。)
谢谢!
python - 我可以使用 ctypes 为可变参数 Python 函数创建原型,以便 DLL 可以将此函数作为回调调用吗?
这是场景:我正在使用 ctypes 将 C DLL 加载到 Python 程序中。我想注册一个回调,以便 DLL 中的代码可以调用 Python 中的函数。
这一切都很好,直到我想让函数成为可变参数。例如,假设我想在 Python 中实现“printf”(为了参数,我也会让它返回一个整数):
我正在使用 ctypes 中的 CFUNCTYPE 工厂创建回调函数指针:
当然,由于我只指定了一个输入参数(格式字符串为 Unicode char 数组),因此回调有效但*args
为空。
那么,有什么方法可以使这项工作与 ctypes 一起工作,还是我需要重写我的 C 代码以不需要可变参数回调函数?
c++ - 在 C++ 可变参数模板中传递可变参数
假设我有一个模板函数,它接受可变参数并使用这些参数调用其他函数......
...而其他功能被定义为...
这不会编译,因为使用 std::string 参数调用 func() 将找不到与带有 std::string 参数的 x() 和 y() 的匹配项。
请注意, func() 使用一些外部标准(本示例中的参数 i 的值)来决定将参数 args 传递给哪个其他函数。
有没有办法在不诉诸于将参数 args 填充到 std:tuple 中并传递它的情况下实现这一目标?
[编辑]
好的,我想出了一种对我的目的来说足够好的方法。这是一个示例类来说明...
a() 和 b() 的可变参数模板方法将捕获对 Xx() 的任何调用,其中参数不是单个 int。这解决了我收到的编译器错误,并启用了我正在寻找的更简单的类 API。
c++ - C++ 变量参数
我有一个带有状态机的类,并且希望有一个单一的入口点来将事件传递给状态机。该事件伴随着特定于事件的数据,然后我想将其分派给处理程序。所以它看起来像这样......
};
...使用看起来像这样的调用...
我无法弄清楚如何让模板函数调用正确的处理程序。如果我只是打开 eventId 并传递变量参数,它将无法编译,因为所有参数组合都不存在处理程序(例如,没有 eventA() 处理程序接受 eventB() 参数,我不会无论如何都想要)。
我的猜测是有一些优雅的方法可以做到这一点,但它让我望而却步。
c++ - 一种存储函数及其(任意类型、任意数量)参数的简洁方法
对于一个库,我想要一个函数来接受另一个函数及其参数,然后将它们全部存储起来以供以后调用。参数必须允许任何类型的混合,但函数只需要返回 void。像这样的东西:
一种方法是让 DelayedCaller::setup() 接受 std::function,并让我的库用户在调用 setup() 之前使用 std::bind()。但是,有没有办法实现 setup() 以便用户不需要自己进行绑定?
编辑:DelayedCaller 是一个现有的类。setup() 是我想添加的一个新的静态方法。
c++ - 区分枚举类和常规枚举的 C++11 类型特征
我正在编写类似于 boost::promote 的促销模板别名,但适用于 C++11。这样做的目的是避免在从可变函数检索参数时出现警告。例如
提升模板别名提升可变参数的默认参数提升之后的类型:1) 小于 int 的整数提升为 int 2) 浮点提升为 double
我的问题是可以提升标准 C++ 枚举,但不能提升 C++11 枚举类(编译器不会生成警告)。我希望提升使用常规枚举但忽略 C++11 枚举类。
如何区分我的提升模板别名中的枚举类和枚举?
c++ - C++ 和预处理器宏:可变参数类型
以下面的宏为例:
有没有办法通过使用一个宏_CREATE_VAR
而不是使用具有不同变量参数和相应名称的多个实例来简化这一点?_CREATE_VAR
理想情况下,无论有多少参数,我都想自动调用同一个宏。
c++ - GCC 4.8 正在反转可变参数模板参数包
我刚刚升级到 GCC 4.8,一些可变参数模板代码不再正确编译。我在下面创建了一个最小的示例:
其输出将是(如果注释掉 GCC 4.6.3/4.8 的不正确版本)'a'。
GCC 4.6.3 产生的错误是:
GCC 4.8 产生的错误是:
似乎在 GCC 4.8 中,可变参数模板类型在扩展时被反转,但奇怪的是,它们并没有“真正”被反转,正如输出所证明的那样——无论排序如何,它都将是“a”。Clang 3.3 与 GCC 4.6.3 输出一致。
这是 GCC 4.8 中的错误还是其他错误?
编辑:在此处向 GCC 添加了错误报告:http: //gcc.gnu.org/bugzilla/show_bug.cgi?id= 56774
c++ - 具有不同类型的可变参数函数,传递给线程 cout
好吧,首先到目前为止,这是可行的,但是非常有问题。我希望它能够接受ints
, floats
, doubles
, strings
, 和char*s
. 它通过将所有内容都尝试为 char* 来工作,但如果失败,我希望它作为另一种类型重试。我也想如果我不必传递参数的数量。(更多在底部)
现在,无论如何:
- 让线程输出到控制台,而不会在线程重新加入时使主程序崩溃或挂起(线程池?)
- 使用:(
logHelperMessage(logLevel,firstpram,...)
使用第一个参数获取其内存位置并从那里开始?) - 在:
ss << va_arg(messages,char*);
如果它不能作为一个char*
可能尝试别的东西?
我四处寻找更高级的可变函数,但似乎它们都需要参数数量的参数。或只允许一种类型。另外,如果需要连续循环,我会在程序的其他地方设置一个循环。(我认为这就是一切)
c - c 可变参数函数混淆
我试图弄清楚 va_start(), va_arg() 宏的背后是什么。下面的代码运行良好。
正如我所料,它给出了这样的输出:3 4 5 6 7 8 9。然后我找到了那个宏的定义(在互联网上,因为我的头文件 stdarg.h 很神秘——它定义了宏 va_arg(v, l) 像 _builtin_va_arg( v,l),最后一个没有在其中定义,stdarg.h 不包含任何内容,所以它在某个库中???)。然而,代替“cstdarg”,我写道:
输出变得很奇怪,例如 1 -0.0409377 -0.0409377 4.88084e-270 4.85706e-270 1 2 3 4 5 6 7 8 9。我认为可变参数放在最后声明的参数旁边,但显然还有更复杂的情况。如果有人揭露我错在哪里或那里真正发生了什么,我会非常高兴。