C++ Builder 參考手冊 ? C++ 可變參數的模板
可變參數的模板是 C++ 11 新增的語法,如果用 C++ Builder,需要使用 clang 編譯器,老的 Borland 編譯器不支持。
- 可變參數的模板的寫法
- 輸出可變參數模板的每個參數的值
一. 可變參數的模板的寫法
可變參數的模板的基本寫法:
template <class... T>
void test1(T ...t)
{
printf(t...);
}
可變參數引用的寫法:
如果參數都是傳值的,這些參數如果是類,會調用類的拷貝構造函數,效率很低,把參數寫成引用會提高效率。以下是可變參數引用的方法:
template <class... T>
void test2(T &&...t)
{
printf(t...);
}
例子:寫一個模板函數,輸出數據到調試程序的 Event Log 里面
template <class... T>
void TRACE(T ...t)
{
::OutputDebugString(String().sprintf(t...).c_str());
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i = 123;
double f = 45.6789;
const wchar_t *s = L"Hello, Hsuanlu!";
TRACE(L"i = %d, f = %g, s = %s, π = %g", i, f, s, 3.14);
}
運行結果:
運行結果:輸出到 Event Log
二. 輸出可變參數模板的每個參數的值
由于 C 語言可變參數函數的參數只能使用最基本的 C 語言的類型,而 C++ 的模板的可變參數可以使用 C++ 的類型,比如類,這樣就需要找到一個輸出每個參數的方法。
這個例子使用 ShowValue 這個模板函數輸出單個的參數值,把數值輸出到 Form1->Memo1 里面。
模板函數 OutputValues 是可變參數的,使用 ShowValue 輸出每個參數的值。
OutputValues 是重載的兩個函數,單個參數的函數是為了結束遞歸,一個固定參數和一個可變參數的函數是為了使用遞歸處理每個參數,每次調用都比上一次少一個參數,只剩一個參數的時候,調用的是只有一個參數的 OutputValues ,遞歸結束。
template <class T>
void ShowValue(T &t)
{
Form1->Memo1->Lines->Add(t);
}
template <class T>
void OutputValues(T &&t)
{
ShowValue(t);
};
template <class T, class... T1>
void OutputValues(T &&t, T1 &&...t1)
{
ShowValue(t);
OutputValues(t1...);
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
int i = 123;
double f = 45.6789;
UnicodeString s = L"Hello, Hsuanlu!";
OutputValues(i, f, s, 666, L"abcdefg");
}
運行結果:
可變參數的模板的運行結果
相關:
C++ Builder 參考手冊 ? C++ 可變參數的模板