我用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) 我正在创建一个函数(可能是成员函数,而不是它很重要......也许它确实?)需要接受未知数量的参数,但我希望它们都是相同的类型.我知道我可以传入数组或向量,但我希望能够直接接受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)
但如果可能的话,我宁愿能够以第一种方式做到这一点.
如何计算在以下程序中传递给函数的参数的数量:
#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)
那么如何找到多少没有.实际传递给函数的参数?
不应该像Haskell这样的惰性语言允许这个定义,其中函数是curry?
apply f [] = f
apply f (x:xs) = apply (f x) xs
Run Code Online (Sandbox Code Playgroud)
它基本上是一个将给定函数应用于给定参数列表的函数,并且很容易在Lisp中完成.有没有解决方法?
我想写一个简单的加法器(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()仅适用于非可变参数声明吗?如果是这样的话,你会怎么写这样的功能?
我将一个java lib包装到clojure中,但是我在处理可变长度参数时遇到了问题.说,
TestClass.aStaticFunction(Integer... intList){/*....*/}
Run Code Online (Sandbox Code Playgroud)
我怎么能在clojure中调用这个函数?
我不明白为什么以下不起作用:
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中.这是怎么回事?
可变参数:
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差异(如果有)?
谢谢.
我在哪里可以获得有关实现我自己的省略号表示法的方法的信息,
例如
static void my_printf(char* format, ...) { }
Run Code Online (Sandbox Code Playgroud)
那也就是所谓的省略号表示法还是有更高级的名字?
在这里,我找到了如何在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)
我只能在某种程度上理解这个例子.
我不清楚为什么使用它们va_start(ap, count);.据我所知,通过这种方式我们将迭代器设置为它的第一个元素.但是为什么默认情况下它没有设置到开头?
我不清楚为什么我们需要count作为一个论点.C不能自动确定参数的数量?
我不清楚为什么使用它们va_end(ap).它有什么变化?它是否将迭代器设置为列表的末尾?但它是不是通过循环设置到列表的末尾?而且,为什么我们需要它呢?我们不再使用ap了; 我们为什么要改变它?