在C++中的可變模板引數使用省略號 ...
來表示一個引數包(Parameter Pack),其具體位置決定了這個包是模板引數包還是函式引數包,以及如何進行引數展開。
1. 模板引數包:c... Args
省略號放在型別名稱的右邊,用來表示模板引數包,即可以接受任意數量的模板型別引數。
template<typename... Args> // 模板引數包
class MyClass {
// 這裡 Args 是一個引數包,可以包含多個型別
};
在上面的例子中,typename...
是一個模板引數包,可以接受任意數量的型別引數。
Args
本身是一個型別的集合(例如 int
, double
, std::string
等等)。
2. 函式引數包:Args... args
省略號放在引數名稱的右邊,用來表示函式引數包,即可以接受任意數量的函式實參。
template<typename... Args>
void myFunction(Args... args) {
// 這裡 args 是一個函式引數包,可以包含多個實參
}
在函式中,Args...
是一個函式引數包,可以接收任意數量的函式實參。
與模板引數包不同,args
是一個值的集合,而不是型別的集合。它可以是 int
、double
、std::string
等具體值。
3. 省略號位置的語法總結
- 模板引數包的省略號位於
typename...
或者class...
之後,用於表示多個型別引數。例如:typename... Args
。 - 函式引數包的省略號位於函式引數名之後,表示多個函式實參。例如:
Args... args
。 - 展開引數包時,省略號緊跟在引數包上進行展開。例如:
args...
,表示將args
包中的所有引數逐個傳遞。
4. 實際應用
假設我們想編寫一個通用的函式,它可以接受不同數量和型別的引數並呼叫它們:
template <typename F, typename... Args>
void wrapper(F&& f, Args&&... args) {
std::forward<F>(f)(std::forward<Args>(args)...); // 完美轉發所有引數
}
這裡的 Args... args
表示該函式可以接收多個引數,而 args...
用於展開這些引數進行實際的呼叫操作。
總結
- 省略號
...
用於標記引數包和展開引數包。 - 省略號在 模板引數包 中跟在
typename
後,表示多個型別;在 函式引數包 中跟在函式引數名後,表示多個值。 - 展開引數包時,使用
...
將包內的每個引數逐個處理。