2014-12-04 94 views
1

我想寫一個模板函數有很多參數,所以我只需要使用盡可能多的,我需要。因爲我是新手程序員,所以我想以簡單的方式來做到這一點。我的功能代碼爲:C++中的模板函數與任何數量的參數

template<typename T1 = NULL, typename T2 = NULL> 
void showMessage(T1 input1 = NULL, T2 input2 = NULL) { cout << to_str(input1) << to_str(input2) << endl; } 

,我想這樣稱呼它:

showMessage("Hello"); 

showMessage("Hello ","World"); 

但它似乎沒有工作...

我不想默認輸入到「」,因爲它們可能是數字或布爾等,所以我用NULL來代替。

通常這種事情與函數一起工作,所以我認爲它也可以與模板一起工作。 :(

+0

請解釋「但它似乎不工作......」您的程序是如何工作的? – 2014-12-04 05:04:51

回答

-2

如果你想你的函數有任何數量的參數(但至少有一個),你可以使用<stdarg>函數聲明的語法:

void showMessage(int nArguments,...); 

的第一個參數必須告訴你許多論證會如何跟進,無論是通過簡單地把有沒有號碼或一個其他方法(查找printf())。

要閱讀參數,您需要使用va_listva_start(),va_arg()va_end()

+0

很高興知道我收到什麼-1,只是說。 – Kelm 2014-12-04 05:16:35

4

您可以使用可變參數模板來接受任意數量的參數。

void showMessage() 
{ 
    std::cout << std::endl; 
} 

template<typename T, typename... Args> 
void showMessage(T const& first, Args&&... rest) 
{ 
    std::cout << first; 
    showMessage(std::forward<Args>(rest)...); 
} 

這裏的東西比較簡單一點,也將努力在C++ 03(但只接受的參數的數量有限,而且需要他們成爲缺省構造)

template<typename T = std::string, 
     typename U = std::string, 
     typename V = std::string> 
void showMessage(T const& t = T(), U const& u = U(), V const& v = V()) 
{ 
    std::cout << t << u << v << std::endl; 
} 

的原因我在這裏使用std::string作爲默認類型是因爲默認構造的默認類型發送到cout時不會打印任何內容。您可以爲此製作自己的特殊類型:

struct Nothing {}; 
std::ostream& operator<<(std::ostream& os, Nothing) { return os; }