Рекурсивный расчет значения шаблона переменной - PullRequest
0 голосов
/ 04 ноября 2018

Это то, что я пытаюсь (и не могу) заставить работать. Идея состоит в том, что count<N> должно быть равно N. Это упрощенный случай более сложных вычислений, не обращайте внимания на кажущуюся глупость этого кода.

template <>
constexpr size_t count<0> = 0;

template <auto N>
constexpr size_t count = 1 + count<static_cast<size_t>(N) - 1>;

int main()
{
    return count<1>;
}

Не компилируется:

<source>:5:23: error: expected initializer before '<' token

 constexpr size_t count<0> = 0;
                       ^

Если я поменяю общий случай со специализацией, он также не скомпилируется. Это даже выполнимо с переменными шаблонами?

Попробуйте онлайн

1 Ответ

0 голосов
/ 04 ноября 2018

Вот правильная версия кода:

template <auto N>
constexpr size_t count = 1 + count<static_cast<size_t>(N) - 1>;

template <>
constexpr size_t count<static_cast<size_t>(0)> = 0;

Обратите внимание на следующее:

  1. Основной шаблон должен быть объявлен перед любой специализацией. Без исключений.
  2. Специализации count<0> и count<static_cast<size_t>(0)> различны, поскольку их аргументы имеют разные типы. В исходном коде, где вы предоставляете явную специализацию count<0>, эта специализация не используется рекурсией, которая происходит в count<1>, как указано в определении основного шаблона, поэтому происходит бесконечная рекурсия.
...