[英]How can I use different struct as template argument in a template function?
[英]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.