Адаптация шаблона с нетиповым параметром в качестве параметра шаблона - PullRequest
2 голосов
/ 28 января 2020

У меня есть шаблон, который может быть уменьшен до следующего

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;
}

1 Ответ

0 голосов
/ 28 января 2020

Это основной вопрос 1478 ; некоторые реализации требуют ::template здесь, как указано в комментариях. Самый текущий план (мой) состоит в том, чтобы заставить этот случай работать без template и отказаться от его ненужного использования (в отличие от его цели синтаксического анализа ). Может пройти некоторое время, прежде чем реализации последуют этому правилу, поскольку оно еще даже не проверялось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...