Здравствуйте, PM, Вы писали:
PM>Здравствуйте, Шахтер, Вы писали:
PM>А можно объяснить в двух словах отличия от std::tuple и чем оно лучше? Я пока вижу одно — не работает без конструктора по умолчанию:
Оно не лучше. Это пример, демонстрирующий как можно строить tuple по-новому, без рекурсии, с использованием новых возможностей языка.
Естественно, если нужен полнофункциональный tuple, то код нужно расширять.
Здравствуйте, Шахтер, Вы писали:
PM>>А можно объяснить в двух словах отличия от std::tuple и чем оно лучше? Я пока вижу одно — не работает без конструктора по умолчанию:
Ш>Оно не лучше. Это пример, демонстрирующий как можно строить tuple по-новому, без рекурсии, с использованием новых возможностей языка. Ш>Естественно, если нужен полнофункциональный tuple, то код нужно расширять.
Понятно. Дьявол, как обычно, в мелочах. Емнип, в libc++ тоже нерекурсивная реализация tuple
Здравствуйте, _hum_, Вы писали:
__>так а почему нерекурсивный-то,
рекурсивно сделано у студии:
template<class _This,
class... _Rest>
class tuple<_This, _Rest...>
: private tuple<_Rest...>
то есть тупл для N элементов делается через наследование от тупла для N-1 элементов
__>ведь "class ... TT" присутствует, значит, компилятор будет работать по рекурсии
это короткая запись (см. parameter pack http://en.cppreference.com/w/cpp/language/parameter_pack ) для группы типов, тут рекурсии нет
// как сам типtemplate<class... TT> struct Tuple;
// так и, затем, его функции доступаtemplate<int I, class... TT> auto get(Tuple<TT...>& tt) -> Ref < PickType<I, TT...> >;
template<int I, class... TT> auto get(Tuple<TT...> const& tt) -> CRef< PickType<I, TT...> >;
// Ref, CRef - лень думать, как правильно пробрасывать ссылочность и константность
// для кортежей с обычными, ссылочными и константными типами компонентов
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Шахтер, Вы писали:
Ш>>Ловите
К>Мне кажется, что лучше, всё-таки, делать результирующие типы не using'ом зависимых имён, а наследованием. К>
Здравствуйте, PM, Вы писали:
PM>Здравствуйте, Шахтер, Вы писали:
PM>>>А можно объяснить в двух словах отличия от std::tuple и чем оно лучше? Я пока вижу одно — не работает без конструктора по умолчанию:
Ш>>Оно не лучше. Это пример, демонстрирующий как можно строить tuple по-новому, без рекурсии, с использованием новых возможностей языка. Ш>>Естественно, если нужен полнофункциональный tuple, то код нужно расширять.
PM>Понятно. Дьявол, как обычно, в мелочах. Емнип, в libc++ тоже нерекурсивная реализация tuple
Она везде сейчас рекурсивная.
Что не есть совсем плохо, но и не очень хорошо (например, при диагностике ошибок вылезают простыни с именами всех промежуточных типов).
Хочется сделать плоскую.
Здравствуйте, Шахтер, Вы писали:
PM>>>>А можно объяснить в двух словах отличия от std::tuple и чем оно лучше? Я пока вижу одно — не работает без конструктора по умолчанию:
Ш>>>Оно не лучше. Это пример, демонстрирующий как можно строить tuple по-новому, без рекурсии, с использованием новых возможностей языка. Ш>>>Естественно, если нужен полнофункциональный tuple, то код нужно расширять.
PM>>Понятно. Дьявол, как обычно, в мелочах. Емнип, в libc++ тоже нерекурсивная реализация tuple
Ш>Она везде сейчас рекурсивная. Ш>Что не есть совсем плохо, но и не очень хорошо (например, при диагностике ошибок вылезают простыни с именами всех промежуточных типов). Ш>Хочется сделать плоскую.
Выше приведена ссылка на нерекурсивную реализацию tuple в стандартной библиотеке В boost.hana тоже нерекурcивный кортеж.
Насколько я понимаю, основное преимущество нерекурсивных раскрытий вариадиков — линейное инстанцирование шаблонов, т.е. теоретически меньшее время компиляции и потребляемый компилятором объем памяти.