请原谅我已经回答了,因为我找不到它......
基本上我有一个对象需要在它的构造函数中获取可变参数列表并将参数存储在向量中.如何从可变参数构造函数的参数初始化向量?
class GenericNode {
public:
GenericNode(GenericNode*... inputs) {
/* Something like... */
// inputs_.push_back(inputs)...;
}
private:
std::vector<GenericNode*> inputs_;
};
Run Code Online (Sandbox Code Playgroud) 有没有办法va_list从头开始创建?我正在尝试调用一个va_list带有参数的函数:
func(void **entry, int num_args, va_list args, char *key);
Run Code Online (Sandbox Code Playgroud)
...来自不采用可变数量参数的函数.我能想到的唯一方法是创建一个中间函数,它接受varargs然后传递它的va_list,这是非常愚蠢的:
void stupid_func(void **entry, char *key, int num_args, ...) {
va_list args;
va_start(args, num_args);
func(entry, num_args, args, key);
va_end(args);
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的办法?我不能改变func签名.
可能重复:
C编程:转发变量参数列表.
我想做的是以printf方式将数据发送到日志库(我无法修改).
所以我想要一个像这样的函数:
void log_DEBUG(const char* fmt, ...) {
char buff[SOME_PROPER_LENGTH];
sprintf(buff, fmt, <varargs>);
log(DEBUG, buff);
}
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式将varargs传递给另一个vararg函数吗?
是否可以在java中创建一个支持任意数量参数的函数,然后能够遍历提供给函数的每个参数?
谢谢
幼狮
问题'传递va_list或指向va_list的指针?' 有一个答案引用标准(ISO/IEC 9899:1999 - §7.15'变量论点<stdarg.h>,脚注212)明确地说:
允许创建指向a的指针
va_list并将该指针传递给另一个函数,在这种情况下,原始函数可以在另一个函数返回后进一步使用原始列表.
我正在编译一些代码,可以通过以下示例(真正的代码非常复杂,原始函数比这里显示的工作要多得多).
#include <stdarg.h>
#include <stdio.h>
static void test_ptr(const char *fmt, va_list *argp)
{
int x;
x = va_arg(*argp, int);
printf(fmt, x);
}
static void test_val(const char *fmt, va_list args)
{
test_ptr(fmt, &args);
}
static void test(const char *fmt, ...)
{
va_list args;
va_start(args, fmt); /* First use */
test_val(fmt, args);
va_end(args);
va_start(args, fmt); /* Second use */
test_ptr(fmt, &args);
va_end(args);
}
int main(void)
{
test("%d", 3);
return 0; …Run Code Online (Sandbox Code Playgroud) 我需要一个EnumSet数组(通过varargs方法参数给出).首先,我很惊讶在EnumSet(有EnumSet#of(E first, E... rest))中没有varargs构造函数方法.作为一种解决方法,我使用了以下变体:
EnumSet<Options> temp = EnumSet.copyOf(Arrays.asList(options));
Run Code Online (Sandbox Code Playgroud)
但是,这会触发一个java.lang.IllegalArgumentException: Collection is empty.所以,现在我最终得到了以下内容,看起来有些荒谬:
EnumSet<Options> temp = options.length > 0 ?
EnumSet.copyOf(Arrays.asList(options)) :
EnumSet.noneOf(Options.class);
Run Code Online (Sandbox Code Playgroud)
如果当然这可以转移到一些实用方法,但仍然,我问自己是否有一种更简单的方法使用现有的方法?
Java 9附带了用于创建不可变列表的便捷工厂方法.最后,列表创建非常简单:
List<String> list = List.of("foo", "bar");
Run Code Online (Sandbox Code Playgroud)
但是这个方法有12个重载版本,11个有0到10个元素,另一个有var args.
static <E> List<E> of(E... elements)
Run Code Online (Sandbox Code Playgroud)
同样是与案件Set和Map.
由于存在var args方法,有多少11种方法有什么意义呢?
我认为var-args创建一个数组,所以其他11个方法可以跳过创建一个额外的对象,在大多数情况下会有0-10个元素.还有其他原因吗?
我想更好地理解当Java编译器遇到如下方法的调用时会发生什么.
<T extends AutoCloseable & Cloneable>
void printType(T... args) {
System.out.println(args.getClass().getComponentType().getSimpleName());
}
// printType() prints "AutoCloseable"
Run Code Online (Sandbox Code Playgroud)
我很清楚,<T extends AutoCloseable & Cloneable>在运行时没有类型,因此编译器可以做出最少的错误,并创建一个类型为两个边界接口之一的数组,丢弃另一个.
无论如何,如果切换接口的顺序,结果仍然是相同的.
<T extends Cloneable & AutoCloseable>
void printType(T... args) {
System.out.println(args.getClass().getComponentType().getSimpleName());
}
// printType() prints "AutoCloseable"
Run Code Online (Sandbox Code Playgroud)
这导致我做了一些调查,看看接口发生变化时会发生什么.在我看来,编译器使用某种严格的顺序规则来决定哪个接口是最重要的,并且接口在代码中出现的顺序不起作用.
<T extends AutoCloseable & Runnable> // "AutoCloseable"
Run Code Online (Sandbox Code Playgroud)
<T extends Runnable & AutoCloseable> // "AutoCloseable"
Run Code Online (Sandbox Code Playgroud)
<T extends AutoCloseable & Serializable> // "Serializable"
Run Code Online (Sandbox Code Playgroud)
<T extends Serializable & AutoCloseable> // "Serializable"
Run Code Online (Sandbox Code Playgroud)
<T extends SafeVarargs & Serializable> // "SafeVarargs"
Run Code Online (Sandbox Code Playgroud)
<T extends Serializable …Run Code Online (Sandbox Code Playgroud) 在此代码构造中:
public MyClass(Integer... numbers) {
do_something_with(numbers[]);
}
Run Code Online (Sandbox Code Playgroud)
是否可以要求numbers以这种方式包含至少一个条目,以便在编译时检查?(在运行时,当然,我可以检查numbers.length.)
显然,我可以做到这一点:
public MyClass(Integer number, Integer... more_numbers) {
do_something_with(number, more_numbers[]);
}
Run Code Online (Sandbox Code Playgroud)
但这不会很优雅.
我想这样做的原因是为了确保子类不会完全忘记调用这个构造函数,这将默认为super()在列表中没有数字的调用.在这种情况下,我宁愿得到熟悉的错误信息:Implicit super constructor is undefined. Must explicitly invoke another constructor.
是否有另一种方法可以实现相同的效果,例如@ -annotation将此构造函数标记为非隐式?