2013-05-08 92 views
8

在我的應用程序中,我有很多日誌。我確實在一個名爲errorsLogger的地方積累了所有日誌中的所有錯誤。我實現了這種方式:如何將可變數量的參數轉發給另一個函數?

static Logger errorsLogger; 

.... 

void Logger::Error(std::string format, ...) { 
    va_list arglist; 
    va_start(arglist, format); 

    if (this != &errorsLogger) { 
     errorsLogger.Error(format, arglist);  // how to forward parameters? 
    } 

    vfprintf(logFile, , format.c_str(), arglist); 
    fprintf(logFile, "\n"); 

    fflush(logFile); 
    va_end(arglist); 
} 

但是預期errorsLogger包含有點怪這串代碼不起作用 - 它似乎變量參數沒有通過。如何解決我的代碼有效?

+1

您需要一個採用['va_list'](http://en.cppreference.com/w/cpp/utility/variadic/va_list)的'Error'版本。 – BoBTFish 2013-05-08 18:48:11

+1

考慮改變記錄器的界面,使其看起來像'ostream',你就可以做這樣的事情:'Logger :: error()<<「變量x是」<< x;'事實上'Logger ::錯誤()'可以返回'ostream&' – piokuc 2013-05-08 18:48:18

+0

我可以只格式化一個字符串作爲第一步,然後只是轉發std :: string? – javapowered 2013-05-08 19:03:09

回答

13

的這在C的典型的製劑是有兩個功能,一個接受...和一個接受一個va_list(例如,相對於printfvprintf)。在C++中它的方便與重載做到這一點:

// public 
void Logger::Error(const std::string& format, ...) { 
    va_list args; 
    va_start(args, format); 
    Error(format, args); 
    va_end(args); 
} 

// private 
void Logger::Error(const std::string& format, va_list args) { 
    if (this != &errorsLogger) 
     errorsLogger.Error(format, args); 

    vfprintf(logFile, format.c_str(), args); 
    fprintf(logFile, "\n"); 
    fflush(logFile); 
} 

使用C++ 11,可以直接與可變參數模板做。您也可以將參數轉發給C風格的可變參數函數。

template<class... Args> 
void Logger::Error(const std::string& format, Args&&... args) {  
    if (this != &errorsLogger) 
     errorsLogger.Error(format, std::forward<Args>(args)...); 

    fprintf(logFile, format.c_str(), std::forward<Args>(args)...); 
    fprintf(logFile, "\n"); 
    fflush(logFile); 
} 
+0

您絕對可以使用可變模板來轉發C可變參數函數。 [Live example](http://melpon.org/wandbox/permlink/0fbi8R2PCrOJkeFv) – 2016-02-19 20:00:23

4

總之,你不能。

你所能做的只是編寫一個等價的成員函數,它需要一個va_list而不是可變參數,並將初始化的va_list向下傳遞。

+0

你爲什麼低估這個? – 2013-05-08 18:52:37

+1

也許有人想讓它變短?或者他們是一個喜歡寫OC(OH)2的有機化學家?很難說,真的。 – 2013-05-08 19:38:17

+0

@CodyGray LOL,關於有機化學家的好處。 – 2013-05-08 19:39:04

0

對於這個工作,Logger::Error必須聲明接受va_list作爲參數,很像vfprintf,而不是像fprintf那樣的形式爲...的可變參數。