标签: variadic-functions

将可变参数列表插入向量?

请原谅我已经回答了,因为我找不到它......

基本上我有一个对象需要在它的构造函数中获取可变参数列表并将参数存储在向量中.如何从可变参数构造函数的参数初始化向量?

class GenericNode {
public:
    GenericNode(GenericNode*... inputs) {
            /* Something like... */
        // inputs_.push_back(inputs)...;
}
private:
    std::vector<GenericNode*> inputs_;
};
Run Code Online (Sandbox Code Playgroud)

c++ variadic-functions c++11

26
推荐指数
2
解决办法
1万
查看次数

填充va_list

有没有办法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 variadic-functions

25
推荐指数
4
解决办法
2万
查看次数

是否可以编写一个varargs函数将其参数列表发送到另一个varargs函数?

可能重复:
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函数吗?

c++ variadic-functions

25
推荐指数
3
解决办法
2万
查看次数

java:我如何创建一个支持任意数量参数的函数?

是否可以在java中创建一个支持任意数量参数的函数,然后能够遍历提供给函数的每个参数?

谢谢

幼狮

java variadic-functions

25
推荐指数
3
解决办法
9759
查看次数

GCC是否错误处理指向传递给函数的va_list的指针?

问题'传递va_list或指向va_list的指针?' 有一个答案引用标准(ISO/IEC 9899:1999 - §7.15'变量论点<stdarg.h>,脚注212)明确地说:

允许创建指向a的指针va_list并将该指针传递给另一个函数,在这种情况下,原始函数可以在另一个函数返回后进一步使用原始列表.

我正在编译一些代码,可以通过以下示例(真正的代码非常复杂,原始函数比这里显示的工作要多得多).

vap.c

#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)

c variadic-functions

25
推荐指数
3
解决办法
8972
查看次数

EnumSet来自数组,最短的变体?

我需要一个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 arrays enums variadic-functions enumset

25
推荐指数
5
解决办法
1万
查看次数

在Java 9中重载的方便工厂方法的重点是什么?

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)

同样是与案件SetMap.

由于存在var args方法,有多少11种方法有什么意义呢?

我认为var-args创建一个数组,所以其他11个方法可以跳过创建一个额外的对象,在大多数情况下会有0-10个元素.还有其他原因吗?

java collections variadic-functions java-9

25
推荐指数
3
解决办法
1801
查看次数

Java编译器如何为具有多个边界的参数化类型选择运行时类型?

我想更好地理解当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)

java variadic-functions jls multiple-bounds

25
推荐指数
1
解决办法
464
查看次数

在java变量参数列表中至少需要一个元素

在此代码构造中:

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将此构造函数标记为非隐式?

java arguments minimum variadic-functions

24
推荐指数
3
解决办法
9326
查看次数

为什么规范禁止将类类型传递给变量参数C++函数?

通过非荚可变参数函数,如printf是未定义的行为(1,2),但我不理解为什么 C++标准设定这种方式.变量arg函数中是否存在任何固有的东西阻止它们接受类作为参数?

变量arg callee确实对它们的类​​型一无所知 - 但它也不知道它接受的内置类型或普通POD.

此外,这些必然是cdecl函数,因此调用者可以负责例如在传递时复制它们并在返回时销毁它们.

任何见解将不胜感激.


编辑:我仍然没有看到为什么建议的可变参数语义不起作用,但zneak的答案很好地说明了将编译器调整到它需要什么 - 所以我接受了它.最终,这可能是一些历史故障.

c++ variadic-functions language-lawyer

24
推荐指数
3
解决办法
918
查看次数