簡體   English   中英

將帶有非類型參數的模板適配為模板模板參數

[英]Adapting a template with a non-type parameter as a template template parameter

我有一個模板,可以簡化為以下內容

template <typename T, template <typename U> class Base>
class Derived: Base<T> {
};

作為Base我希望能夠使用可能具有非模板參數的模板。 例如

template <unsigned N, typename T>
struct NBase {
};

這顯然不能直接工作,因為它的參數與Base的單個參數不匹配,所以我想我會做類似的事情

template <unsigned S>
struct NAdapter {

   template <typename T>
   using B = NBase<S, T>;
};

這種作品,例如這個編譯:

void f() {
   Derived<int, NAdapter<100>::B> a;
}

然而,這不能編譯

template <unsigned M>
void eval() {
  Derived<int, NAdapter<M>::B> b;
}

由此產生的錯誤是note: expected a class template, got 'NAdapter<M>::B'

有沒有辦法將NBase調整為Base以便在兩種情況下都可以使用?

解決方案

這有效,謝謝@mutableVoid 的建議!

template <unsigned M>
void eval() {
  Derived<int, NAdapter<M>::template B> b;
}

這是核心問題 1478 正如評論中所指出的,某些實現需要::template在這里。 最新的計划(我的)是要求這個案例在沒有template情況下工作,並在那里棄用它不必要的使用(與其解析目的不同)。 實現遵循該規則可能還需要一段時間,因為它甚至還沒有經過審查。

暫無
暫無

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

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