簡體   English   中英

如何使用模板模板類型作為函數參數?

[英]How can I use template template type as an function argument?

我想實現以下代碼:

template <int i>
void f() {
    ...
}
template <template <int i> typename Func>
void g(Func func, int i) {
    if (i == 0) func<0>();
    else if (i == 1) func<1>();
    else if (i == 2) func<2>();
    else assert(false);
}
int main() {
    g(f, 0);
}

但是,此代碼無法編譯。 它說“錯誤:缺少模板模板參數“Func”的參數列表”。 我不知道如何修復它。 非常感謝!

模板可以用作模板的參數,但不能用作函數的參數。 因此錯誤; 當您嘗試使用模板名稱 ( Func ) 作為函數參數的類型時,編譯器會抱怨模板名稱本身是不夠的。 從模板中獲取類型需要模板參數列表,只有這樣它才能成為函數參數的類型。

看起來您正在嘗試將模板參數復制為函數參數。 不要那樣做。 直接使用模板參數。

template <template<int> typename Func>
void g(int i) {
    if (i == 0) Func<0>();
    else if (i == 1) Func<1>();
    else if (i == 2) Func<2>();
    else assert(false);
}

但是,您的設置還有一個問題。 正如typename關鍵字所建議的那樣,模板模板參數不能是函數模板。 所以這是行不通的。 請參閱模板模板參數可以是變量還是函數?


另一種選擇(由 OP 提出)可能是使用類模板和operator() 一個警告是operator()不能是靜態的,因此g有另一種語法變化。

template <template<int> typename Func>
void g(int i) {
    if (i == 0) Func<0>{}();      // <
    else if (i == 1) Func<1>{}(); // < -- Invoke operator() on a temporary
    else if (i == 2) Func<2>{}(); // <
    else assert(false);
}

給定一個類模板f ,這可以通過g<f>(0)調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM