我正在尝试实现可变参数函数。我搜索了网络并最终发现大多数示例只处理一种类型的参数(例如计算许多整数的平均值)。我的情况下,参数类型不固定。它可以同时涉及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的返回值?
答案 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)
在某些其他情况下,例如 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;
}