标签: variadic-functions

如何将变量参数传递给另一个方法?

我用Google搜索并了解了如何使用变量参数.但我想将我的变量参数传递给另一个方法.我得到错误.怎么做 ?

-(void) aMethod:(NSString *) a, ... {
  [self anotherMethod:a]; 
  // i m doing this but getting error. how to pass complete vararg to anotherMethod
}
Run Code Online (Sandbox Code Playgroud)

iphone objective-c variadic-functions ios

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

为使用数组,向量,结构等传递给variadic函数或可变参数模板函数的所有参数指定一种类型?

我正在创建一个函数(可能是成员函数,而不是它很重要......也许它确实?)需要接受未知数量的参数,但我希望它们都是相同的类型.我知道我可以传入数组或向量,但我希望能够直接接受args列表而无需额外的结构甚至是额外的括号.看起来variadic函数本身并不是类型安全的,我不知道如何使用这个w/variadic模板函数.这基本上就是我的目标(更可能不是正确的代码,完全不是为了获取龙的列表,哈哈):

//typedef for dragon_list_t up here somewhere.

enum Maiden {
    Eunice
    , Beatrice
    , Una_Brow
    , Helga
    , Aida
};

dragon_list_t make_dragon_list(Maiden...) {
    //here be dragons
}
Run Code Online (Sandbox Code Playgroud)

要么

template<Maiden... Maidens> dragon_list_t make_dragon_list(Maidens...) {
    //here be dragons
}
Run Code Online (Sandbox Code Playgroud)

用法

dragon_list_t dragons_to_slay
    = make_dragon_list(Maiden.Eunice, Maiden.Helga, Maiden.Aida)
;
Run Code Online (Sandbox Code Playgroud)

尝试了类似于上面的一些事情,没有骰子.建议?我可能做出明显的疏忽?我知道这样做可能不是一件大事:

dragon_list_t make_dragon_list(std::array<Maiden> maidens) {
    //here be dragons.
}
dragon_list_t dragons_to_slay
    = make_dragon_list({Maiden.Eunice, Maiden.Helga, Maiden.Aida})
;
Run Code Online (Sandbox Code Playgroud)

但如果可能的话,我宁愿能够以第一种方式做到这一点.

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

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

如何计算传递给接受可变数量参数的函数的参数数量?

如何计算在以下程序中传递给函数的参数的数量:

#include<stdio.h>
#include<stdarg.h>
void varfun(int i, ...);
int main(){
        varfun(1, 2, 3, 4, 5, 6);
        return 0;
}
void varfun(int n_args, ...){
        va_list ap;
        int i, t;
        va_start(ap, n_args);
        for(i=0;t = va_arg(ap, int);i++){
               printf("%d", t);
        }
        va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)

这个程序在ubuntu 10.04下通过我的gcc编译器输出:

234561345138032514932134513792
Run Code Online (Sandbox Code Playgroud)

那么如何找到多少没有.实际传递给函数的参数?

c variadic-functions

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

如何在Haskell中定义Lisp的应用?

不应该像Haskell这样的惰性语言允许这个定义,其中函数是curry?

apply f [] = f
apply f (x:xs) = apply (f x) xs
Run Code Online (Sandbox Code Playgroud)

它基本上是一个将给定函数应用于给定参数列表的函数,并且很容易在Lisp中完成.有没有解决方法?

haskell types type-inference currying variadic-functions

39
推荐指数
4
解决办法
2663
查看次数

使用具有可变参数模板函数的decltype的尾随返回类型

我想写一个简单的加法器(giggles),它将每个参数相加并返回一个具有适当类型的和.目前,我有这个:

#include <iostream>
using namespace std;

template <class T>
T sum(const T& in)
{
   return in;
}

template <class T, class... P>
auto sum(const T& t, const P&... p) -> decltype(t + sum(p...))
{
   return t + sum(p...);
}

int main()
{
   cout << sum(5, 10.0, 22.2) << endl;
}
Run Code Online (Sandbox Code Playgroud)

在GCC 4.5.1上,这似乎适用于2个参数,例如sum(2,5.5)返回7.5.但是,由于参数多于此,我得到的错误是sum()尚未定义.如果我这样声明sum():

template <class T, class P...>
T sum(const T& t, const P&... p);
Run Code Online (Sandbox Code Playgroud)

然后它适用于任意数量的参数,但sum(2,5.5)将返回整数7,这不是我所期望的.有两个以上的参数我假设decltype()必须进行某种递归才能推导出t + sum(p ...)的类型.这是合法的C++ 0x吗?或者decltype()仅适用于非可变参数声明吗?如果是这样的话,你会怎么写这样的功能?

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

38
推荐指数
3
解决办法
5626
查看次数

如何在clojure中处理java变量长度参数?

我将一个java lib包装到clojure中,但是我在处理可变长度参数时遇到了问题.说,

TestClass.aStaticFunction(Integer... intList){/*....*/}
Run Code Online (Sandbox Code Playgroud)

我怎么能在clojure中调用这个函数?

clojure variadic-functions clojure-java-interop

38
推荐指数
3
解决办法
6402
查看次数

Java中的Varargs到ArrayList问题

我不明白为什么以下不起作用:

public void doSomething(int... args){
  List<Integer> broken = new ArrayList<Integer>(Arrays.asList(args))
}
Run Code Online (Sandbox Code Playgroud)

我的理解是编译器将"int ... args"转换为数组,因此上面的代码应该可以工作.

而不是工作,我得到:

找不到符号符号:构造函数ArrayList(java.util.List <int[]>)location:class java.util.ArrayList <java.lang.Integer>

多奇怪.我没有在数组列表中添加数组,我将列表中的每个元素添加到arraylist中.这是怎么回事?

java generics variadic-functions

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

Java varargs方法参数列表与数组

可变参数:

public static void foo(String... string_array) { ... }
Run Code Online (Sandbox Code Playgroud)

单阵列参数:

public static void bar(String[] string_array) { ... }
Run Code Online (Sandbox Code Playgroud)

Java 1.6似乎接受/拒绝以下内容:

String[] arr = {"abc", "def", "ghi"};
foo(arr);  // accept
bar(arr);  // accept
foo("abc", "def", "ghi");  // accept
bar("abc", "def", "ghi");  // reject
Run Code Online (Sandbox Code Playgroud)

假设上述是真的/正确的,为什么不总是使用varargs而不是单个数组param?似乎免费增加了一点来电灵活性.

专家是否可以共享内部JVM差异(如果有)?

谢谢.

java variadic-functions

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

C#中的省略号表示法?

我在哪里可以获得有关实现我自己的省略号表示法的方法的信息,

例如

static void my_printf(char* format, ...) { }
Run Code Online (Sandbox Code Playgroud)

那也就是所谓的省略号表示法还是有更高级的名字?

c# ellipsis variadic-functions

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

在C中使用varargs的一个例子

在这里,我找到了如何在C中使用varargs的示例.

#include <stdarg.h>

double average(int count, ...)
{
    va_list ap;
    int j;
    double tot = 0;
    va_start(ap, count); //Requires the last fixed parameter (to get the address)
    for(j=0; j<count; j++)
        tot+=va_arg(ap, double); //Requires the type to cast to. Increments ap to the next argument.
    va_end(ap);
    return tot/count;
}
Run Code Online (Sandbox Code Playgroud)

我只能在某种程度上理解这个例子.

  1. 我不清楚为什么使用它们va_start(ap, count);.据我所知,通过这种方式我们将迭代器设置为它的第一个元素.但是为什么默认情况下它没有设置到开头?

  2. 我不清楚为什么我们需要count作为一个论点.C不能自动确定参数的数量?

  3. 我不清楚为什么使用它们va_end(ap).它有什么变化?它是否将迭代器设置为列表的末尾?但它是不是通过循环设置到列表的末尾?而且,为什么我们需要它呢?我们不再使用ap了; 我们为什么要改变它?

c syntax variadic-functions

34
推荐指数
3
解决办法
4万
查看次数