У меня есть шаблон, который может быть уменьшен до следующего
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;
}