Как работает этот вариадический шаблон?

Я смотрел на этот вопрос SOи не мог понять, как работает ответ. Я выложу копию кода в одном из ответов для справки:

template struct seq {};

// How does this line work?
template struct gens : gens {};

template struct gens<0, S...>{ typedef seq type; };

double foo(int x, float y, double z)
{
    return x + y + z;
}

template 
struct save_it_for_later
{
  std::tuple params;
  double (*func)(Args...);

  double delayed_dispatch()
  {
     return callFunc(typename gens::type());
  }

  template
  double callFunc(seq)
  {
     return func(std::get(params) ...);
  }
};

int main(void)
{
  std::tuple t = std::make_tuple(1, 1.2, 5);
  save_it_for_later saved = {t, foo};
  cout << saved.delayed_dispatch() << endl;
}

Часть, которую я не понимаю, такова:

template struct gens : gens {};

В примере на return callFunc(typename gens::type());Я предполагаю, что размер.. (Аргс) будет 3. Итак,

template struct gens : gens {};

становится

template<3, {}> struct gens : gens<3-1, 3-1, {}> {};

Правильно ли это, и если да, то что происходит оттуда?

6
задан Community 23 May 2017 в 11:59
поделиться