NK
Size: a a a
NK
O
Tag и вставляет после первого аргументаtemplate<typename Tag, typename... Args>
struct insert_tag_after_first_arg {
using type = type_list<Args...>;
};
template<
template<typename...> class Tag,
typename... TagTypes,
typename FirstArg,
typename... Args>
struct insert_tag_after_first_arg<
Tag<TagTypes...>,
FirstArg, Args...>
{
using type = type_list<FirstArg, TagTypes..., Args...>;
};
template<
template<typename...> class Tag,
typename... Args>
struct insert_tag_after_first_arg<
Tag<Args...>>
{
using type = type_list<Args...>;
};
Довольно прямолинейный код, придётся задокументировать каждую из специализаций, ибо у нас нет какого-то общего случаяtemplate<typename Tag, typename... Args>
struct insert_tag_after_first_arg
: insert_tag_after_first_arg<
type_list<>, Args...
> {};
template<
template<typename...> class Tag,
typename... TagTypes,
typename FirstArg,
typename... Args>
struct insert_tag_after_first_arg<
Tag<TagTypes...>, FirstArg, Args...>
: insert_tag_after_first_arg<
type_list<FirstArg, TagTypes..., Args...>
> {};
template<
template<typename...> class Tag,
typename... Args>
struct insert_tag_after_first_arg<Tag<Args...>>
{
using type = type_list<Args...>;
};
Сложночитаемо, но, во-первых, художественно идейно красиво, а во вторых, у нас один type вместо трёх, что упрощает документирование — в документацию вообще не помещаем ни одну из специализаций, а описываем общий случай с единственным type, отнаследованным от одной специализацииO
O
using type =, или хотим иметь только один тайп алиас, который документируется один разNK

D
D
D
O
NK
NK
NK
D
NK
NK
А
D
NK
D
