Я пытаюсь понять, почему этот код постоянно генерирует ошибки компиляции, так как, насколько я понимаю, специализация шаблона должна препятствовать дальнейшему расширению шаблона, поскольку оно достигает INDEX = 0, и это должно быть единственной рекурсией в коде.
template <typename STREAM, typename TUPLE, std::size_t INDEX> struct streamer {
STREAM &operator()(STREAM &out, const TUPLE &tuple) {
streamer<STREAM, TUPLE, INDEX - 1U> stream;
return out << stream(out, tuple) << std::get<INDEX>(tuple);
}
};
template <typename STREAM, typename TUPLE> struct streamer<0> {
STREAM &operator()(STREAM &out, const TUPLE &tuple) {
return out << std::get<INDEX>(tuple);
}
};
template <typename STREAM, typename TUPLE>
STREAM &operator<<(STREAM &out, const TUPLE &tuple) {
streamer<STREAM, TUPLE, std::tuple_size<TUPLE>::value - 1U> stream;
return stream(out, tuple);
}
int main() {
std::tuple<std::string, std::string> a_guy("name", "surname");
std::cout << a_guy << std::endl;
return 0;
}
Обратите внимание, что вопрос не в том, «как напечатать кортеж», поскольку их уже много.Вопрос в том, почему этот конкретный код не работает, и, в частности, почему он делает цикл компилятора вечным.