Документация Boost.Hana для tuple_c
состояния:
Также обратите внимание, что тип объектов, возвращаемых tuple_c
, и
эквивалентный вызов make<tuple_tag>
может отличаться.
и следующий фрагмент:
BOOST_HANA_CONSTANT_CHECK(
hana::to_tuple(hana::tuple_c<int, 0, 1, 2>)
==
hana::make_tuple(hana::int_c<0>, hana::int_c<1>, hana::int_c<2>)
);
Однако фактическая реализация для tuple_c
просто имеет:
#ifdef BOOST_HANA_DOXYGEN_INVOKED
template <typename T, T ...v>
constexpr implementation_defined tuple_c{};
#else
template <typename T, T ...v>
constexpr hana::tuple<hana::integral_constant<T, v>...> tuple_c{};
#endif
и, действительно, фрагмент кода работает просто отлично без оболочки to_tuple
:
BOOST_HANA_CONSTANT_CHECK(
hana::tuple_c<int, 0, 1, 2>
==
hana::make_tuple(hana::int_c<0>, hana::int_c<1>, hana::int_c<2>)
);
Вопрос : почему определяется фактический тип реализации tuple_c
? Разве обертка to_tuple
не лишняя?