标签: variadic-functions

x86_64 va_list结构的格式是什么?

任何人都有参考va_listx86_64 ABI(在Linux上使用的那个)的表示?我正在尝试调试一些代码,其中堆栈或参数似乎已损坏,这将真正有助于理解我应该看到的内容......

c linux x86-64 abi variadic-functions

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

Scala:构造函数采用Seq或varargs

我猜测,出于兼容性原因,vararg参数的类型Any*是Array [Any] - 如果我错了,请更正.但是,这并不能解释以下错误:

class Api(api_url: String, params: Seq[(String, String)]) {
  def this(api_url: String, params: (String, String)*)
    = this(api_url, params.seq)
}
Run Code Online (Sandbox Code Playgroud)

此代码无法编译,但会发出警告:

double definition:构造函数Api:(api_url:String,params:(String,String)*)Api和构造函数Api:(api_url:String,params:Seq [(String,String)])第13行的Api在擦除后具有相同的类型:(api_url:java.lang.String,params:Seq)Api

那么如何定义一个采用varargs或序列的构造函数呢?

constructor types scala variadic-functions

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

如何填写va_list

如果我有一个va_list,我知道如何提取它的所有元素:

void printInts(int n,...)
{
    va_list va;
    va_start(va, n);
    for(unsigned int i=0; i<n; i++)
    {
        int arg=va_arg(va, int);
        printf("%d",arg);
    }
    va_end(va);
} 
Run Code Online (Sandbox Code Playgroud)

因此,当我调用printInts(3,1,2,3)时,va_list将填充所有参数.
但是如何在不使用va_start的情况下手动填充va_list?我的意思是我想要这样的东西:

va_list va;
push_arg(va, int, 5); // And so on until I fill all parameters
...
Run Code Online (Sandbox Code Playgroud)

我需要这个,因为有一个函数接受va_list作为参数,我不知道如何填充其所有参数的va_list.

c variadic-functions

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

如何使用Stream.of只创建一个Stream <String []>?

使用Stream.of创建通用流非常方便,但是如果我想创建一个Stream<String[]>只有一个元素呢?

比方说我有:

String[] tropicalFruits = new String[] {"pineapple", "banana", "mango"};
String[] fruits = new String[] {"melon", "peach", "apple"};
Run Code Online (Sandbox Code Playgroud)

然后Stream.of(tropicalFruits, fruits)产生Stream<String[]>两个元素.如何为单个元素的流实现相同的功能?如果我尝试:

Stream<String[]> fruityStream = Stream.of(tropicalFruits);
Run Code Online (Sandbox Code Playgroud)

我明白了:

错误:不兼容的类型:推理变量T具有不兼容的边界
相等约束:java.lang.String[]
下限:java.lang.String

Stream<String[]> fruityStream = Stream.of(fruits);
                                 ^---------------^
Run Code Online (Sandbox Code Playgroud)

我用Google搜索并搜索了但是我什么也没得到.在我看来,这不是一个非常不寻常的或esoeteric问题,所以有点令人惊讶我没有得到任何答案(或者我没有用正确的关键词搜索).

java type-inference variadic-functions java-8 java-stream

20
推荐指数
3
解决办法
1159
查看次数

具有无限数量参数的Ruby函数

如何创建没有明确参数数量的Ruby函数?

需要更多澄清吗?

ruby variadic-functions

19
推荐指数
3
解决办法
1万
查看次数

前向声明模板函数的必要性

我最近创建了这个示例代码来说明C++ 11可变参数模板函数的用法.

template <typename Head, typename... Tail> void foo (Head, Tail...);
template <typename... Tail> void foo (int, Tail...);
void foo () {}

template <typename... Tail>
void foo (int x, Tail... tail)
{
    std :: cout << "int:" << x;
    foo (tail...);
}

template <typename Head, typename... Tail>
void foo (Head x, Tail... tail)
{
    std :: cout << " ?:" << x;
    foo (tail...);
}

foo (int (123), float (123)); // Prints "int:123 ?:123.0"
Run Code Online (Sandbox Code Playgroud)

如果foo省略了前向声明的前两行,则会打印出来int:123int:123.这让一位经验丰富,知识渊博的C++程序员感到惊讶.

他确信前向声明不应该是必要的,因为在两阶段查找的第二阶段之前,身体不会被实例化.他认为编译器(gcc …

c++ variadic-functions one-definition-rule variadic-templates c++11

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

在Java 7中使用方法重载时,为什么autoboxing不会覆盖varargs?

我们的Java项目中有一个类LogManager,如下所示:

public class LogManager {

    public void log(Level logLevel, Object... args) {
        // do something
    }

    public void log(Level logLevel, int value, Object... args) {
        // do something else
    }
}
Run Code Online (Sandbox Code Playgroud)

在Debian下用OpenJDK 6编译项目时,每个工作都很好.使用OpenJDK 7时,构建(使用ant完成)会产生以下错误,并且构建失败:

[javac] /…/LogManager.java:123: error: reference to log is ambiguous,
                      both method log(Level,Object...) in LogManager
                      and method log(Level,int,Object...) in LogManager match
[javac]       log(logLevel, 1, logMessage);
[javac]       ^
[javac] /…/SomeOtherClass.java:123: error: reference to log is ambiguous,
                      both method log(Level,Object...) in LogManager
                      and method log(Level,int,Object...) in …
Run Code Online (Sandbox Code Playgroud)

java compiler-construction autoboxing overloading variadic-functions

19
推荐指数
1
解决办法
2471
查看次数

具有已知类型的可变数量参数的函数,c ++ 11方式

我已经知道stdarg.h在c ++中使用带有变量参数的函数的方法,例如这里讨论的.我也知道C++ 11标准都有所解释的可变参数模板这里.

但是在前面提到的两种方案中,我们都不知道(并且我们不能强制)参数类型在编译时间afaik.我正在寻找的是将已知类型的变量参数传递给函数.我认为这可以做到,因为我在这里读到它:

变量模板,也可用于创建带有可变数量参数的函数,通常是更好的选择,因为它们不对参数的类型施加限制,不执行整数和浮点升级,并且类型安全.

可能吗?如果是,我该怎么做?

c++ templates variadic-functions variadic-templates c++11

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

Java通用varargs方法参数

我想知道是否有一种简单,优雅和可重用的方法将字符串和字符串数组传递给期望varargs的方法.

/**
 * The entry point with a clearly separated list of parameters.
 */
public void separated(String p1, String ... p2) {
    merged(p1, p2, "another string", new String[]{"and", "those", "one"});
}

/**
 * For instance, this method outputs all the parameters.
 */
public void merged(String ... p) {
    // magic trick
}
Run Code Online (Sandbox Code Playgroud)

即使所有类型都是一致的(String)我也找不到告诉JVM 压扁 p2并将其注入合并参数列表的方法?

此时,唯一的方法是创建一个新数组,将所有内容复制到其中并将其传递给该函数.

任何的想法?


编辑

根据您的建议,这里是我将使用的通用方法:

/**
 * Merge the T and T[] parameters into a new array.
 *
 * @param type       the …
Run Code Online (Sandbox Code Playgroud)

java arrays variadic-functions

19
推荐指数
2
解决办法
6481
查看次数

是否存在vararg函数优先于可变参数模板的情况?

可变参数模板有很多优点,但有时候<cstdarg>应该使用C风格的可变参数函数(使用)吗?

c++ variadic-functions variadic-templates c++11

19
推荐指数
3
解决办法
1536
查看次数