一、變參模板的定義
變參模板的意思說(shuō)的是從 C++ 11 開(kāi)始,模板參數(shù)接受不變的個(gè)數(shù)。類似于 C 語(yǔ)言中的 printf() 函數(shù)一樣。
二、變參模板的定義及使用
定義一個(gè)變參模板,其中 print() 為重載的函數(shù),第一個(gè)是普通的函數(shù),第二個(gè)變參模板函數(shù)。
void print() {
std::cout << "print over" << std::endl;
}
template<typename T, typename...Types>
void print(T firstArgs, Types...args) {
std::cout << firstArgs << std::endl;
std::cout << "types: " << sizeof...(Types) << std::endl;
std::cout << "args: " << sizeof...(args) << std::endl;
print(args...);
}
然后,調(diào)用如下
print(7.5, "Hello", "World");
我們可以傳入任意類型及個(gè)數(shù)的參數(shù),前面會(huì)一直遞歸調(diào)用變參模板函數(shù),然后在沒(méi)有參數(shù)后,調(diào)用 print() 退出遞歸。
上面注意,定義變參 type 時(shí),如下在 typename 后面加...
typename... Types
聲明參數(shù)時(shí),在 Types 后面加...
Types... args
而使用參數(shù)時(shí),在 args 后面...
args...
也就是說(shuō)都是在關(guān)鍵字、類型、參數(shù)后面加 ...
三、變參模板的其他主題
1. 新的運(yùn)算符, sizeof...()
sizeof...() 既可以計(jì)算 Types 的個(gè)數(shù),也可以計(jì)算 args 的個(gè)數(shù),如上 demo 中。
2. 折疊表達(dá)式
從 c++17 開(kāi)始提供了一個(gè)二元運(yùn)算符,可以在直接計(jì)算出變參參數(shù)的結(jié)果。
template<typename...Types>
auto foldSum(Types... t) {
return (... + t);
}
折疊表達(dá)式的幾種形式如下
3. 變參模板在實(shí)際中的使用
智能指針 std::make_shared 如 std::make_shared<T>(1,2,3,4....)
std::vector 的 emplace() ,如 emplace(1,2,3,4,"hello")
std::thread 線程函數(shù)的參數(shù) ,如 std::thread(func, 1, 2, "hello");
其他更多主題待參考。