c++可變模板引數

牛马chen發表於2024-10-07

在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 是一個值的集合,而不是型別的集合。它可以是 intdoublestd::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 後,表示多個型別;在 函式引數包 中跟在函式引數名後,表示多個值。
  • 展開引數包時,使用 ... 將包內的每個引數逐個處理。

相關文章