Я смотрел на этот вопрос 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
Я предполагаю, что размер.. (Аргс)
будет 3
.
Итак,
template struct gens : gens {};
становится
template<3, {}> struct gens : gens<3-1, 3-1, {}> {};
Правильно ли это, и если да, то что происходит оттуда?