2011-02-05 57 views
3

我想实现一个可变参数函数。我搜索了网页,最终发现大多数例子只处理一种类型的参数(例如计算多个整数的平均值)。我的情况下,参数类型不固定。它可以涉及char *,int或两者同时。这里是我结束了代码:C++ varargs/variadic函数与两种类型的参数

void insertInto(int dummy, ...) { 
    int i = dummy; 
    va_list marker; 
    va_start(marker, dummy);  /* Initialize variable arguments. */ 
    while(i != -1) { 
     cout<<"arg "<<i<<endl; 
      /* Do something with i or c here */ 
     i = va_arg(marker, int); 
     //c = va_arg(marker, char*); 
    } 
    va_end(marker);    /* Reset variable arguments.  */ 

现在这样的工作没关系,如果我只需要对付整数但你看到我在评论一个char * C变量,我想如果用该参数是一个char *。

所以问题是,如何处理va_arg的返回值而不知道它是int还是char *?

回答

10

因为你在做C++,所以不需要使用无类型的C风格可变参数函数。

,你可以简单地定义一个可链接的方法

class Inserter 
    { 
    public: 
     Inserter& operator()(char const* s) 
     { 
      cout << s << endl; 
      return *this; 
     } 

     Inserter& operator()(int i) 
     { 
      cout << i << endl; 
      return *this; 
     } 
    }; 

然后像

Inserter()("blah")(42)("duh") 

变异与常用于建筑模板字符串插入操作使用。

欢呼&心连心,

+1

我们是否缺少一些`return * this`? – Arun 2011-02-05 00:56:58

2

你需要一些知道的方法。考虑printf如何用格式字符串解决这个问题。这不是唯一可行的方法,但它是一个众所周知的方法。

3

所以问题是,如何处理va_arg的返回值而不知道它是int还是char *?

你不行。绝对没有办法确定可变参数的类型。你必须在其他地方指定它。这就是为什么像printf功能需要你给的参数格式字符串类型:

printf("%s %i\n", "Hello", 123); // works 
printf("%s %i\n", 123, "Hello"); // also valid (though most modern compiles will emit a warning), but will produce garbage or crash 
+0

烨好点! :P 我通过期待正确的输入结束了这一过程。意思是我假定参数的顺序是正确的。我可能会尝试检查它,如果我有时间:) – jaivalis 2011-02-05 11:29:05

0

您可以在虚拟参数的处理条件。我有采取“行动”的说法程序和基于动作

例如不同对待的论据:

int i; char *c; 
switch(dummy) { 
    case 1: 
     i = va_arg(marker, int); 
     // do something with i 
     break; 
    case 2: 
     c = va_arg(market, char *); 
     // do something with c 
     break; 
}