c ++ varargs / variadic函数有两种类型的参数

时间:2011-02-05 00:43:36

标签: c++ function variadic-functions

我正在尝试实现可变参数函数。我搜索了网络并最终发现大多数示例只处理一种类型的参数(例如计算许多整数的平均值)。我的情况下,参数类型不固定。它可以同时涉及char *,int或两者。这是我最终得到的代码:

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 *的情况下使用。

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

5 个答案:

答案 0 :(得分: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" )

带有模板化插入操作的变体,通常用于构建字符串。

欢呼&amp;第h。,

答案 1 :(得分:3)

  

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

你做不到。绝对没有办法确定可变参数的类型。你必须在其他地方指定它。这就是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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

来自http://en.wikipedia.org/wiki/Variadic_function#Variadic_functions_in_C.2C_Objective-C.2C_C.2B.2B.2C_and_D

  

在某些其他情况下,例如   printf,数量和类型   参数是从a中找出的   格式字符串。在这两种情况下,这个   实际上取决于程序员   提供正确的信息。

因此,要处理多种类型,insertInto()需要格式化字符串等概念。

答案 4 :(得分: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;
}