2011-02-05 58 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; 
}