4

Im пытается реализовать вариационную оболочку шаблона loki typelist.Слияние двух вариационных шаблонов в одном

Слияние двух списков типов в стиле loki прост, но у меня возникают проблемы с слиянием в стиле вариатор-шаблон.

Это моя реализация (упрощенная, без push_back, index_of, ..., методов).

template<typename... Ts> 
struct dl32TypeList; 

template<typename HEAD , typename... TAIL> 
struct dl32TypeList<HEAD,TAIL...> 
{ 
    static const unsigned int size = sizeof...(TAIL) + 1; 

    using value = dl32Loki_like_TypeList<HEAD, typename dl32TypeList<TAIL...>::value>; 
}; 

template<> 
struct dl32TypeList<> 
{ 
    using value = dl32NoType; 

    static const unsignedint size = 0; 
}; 

Я хочу что-то вроде:

template<typename OTHER_TYPELIST> 
using merge = dl32TypeList<HEAD , TAIL... , typename OTHER_TYPELIST::???>; 

И это проблема: мы не можем хранить VARIADIC арг шаблона как с помощью/ЬурейеЕ, поэтому у меня есть какие-либо идеи о том, как я могу это сделать. (Обратите внимание на OTHER_TYPELIST :: ???).

+0

Не могли бы вы предоставить полный пример? Что такое 'dl32Loki_like_TypeList', значит ли это' dl32TypeList'? Что такое 'dl32NoType'? –

+0

Извините, вы верны, сообщение слишком короткое. dl32 является префиксом моих типов библиотек. dl32TypeList - это оболочка стиля-списка в стиле loki (как описано в «Современном C++-дизайне» Александреску, dl32_loki_style_typelist - это реализация этого списка). dl32NoType - это тип без значения, в основном знак для операций типа. В этом случае dl32NoType отмечает конец списка типов. – Manu343726

+0

@ Manu343726 Мне действительно не нравится исследовать это, но реализуете ли вы модельлист из книги ** 2001 **, используя ** тип C++ 11 ** для родного типа? Это чисто упражнение? Перевод пакета параметров C++ 11 в конструкции C++ 98, а затем добавление интерфейса C++ 11 просто тупо запутанно. – Potatoswatter

ответ

6

Я не знаю, что такое Loki или DL32, и неясно, что вы должны что-то внедрять.

std::tuple является обычным инструментом для списков типов. Он сконструирован как контейнер хранения во время выполнения, но работает как утилита для компиляции, если типы завершены. Вот один из способов сцеплять кортежи:

template< typename ... t > 
struct tuple_cat 
    { typedef decltype(std::tuple_cat(std::declval<t>() ...)) type; }; 

Если вы хотите сделать это вручную, попробуйте частичную специализацию:

template< typename ... t > 
struct type_list {}; 

template< typename ta, typename tb > 
struct type_cat; 

template< typename ... a, typename ... b > 
struct type_cat< type_list< a ... >, type_list< b ... > > 
    { typedef type_list< a ..., b ... > type; }; 

Что касается size члена, вы можете сделать универсальную metafunction, чтобы решить эту проблему однажды и на всегда.

template<typename> 
struct count_types; 

template< template< typename ... > class t, typename ... a > 
struct count_types< t< a ... > > 
    { static constexpr std::size_t value = sizeof ... a; }; 
+0

Спасибо !!! Это прекрасно работает! – Manu343726

+0

Не могли бы вы предоставить код, чтобы показать, как это будет использоваться, пожалуйста? Борьба с синтаксисом – makar

+0

@makar какой? Задайте отдельный вопрос. Вы можете оставить комментарий здесь со ссылкой, но я не могу гарантировать, что я буду отвечать. – Potatoswatter

 Смежные вопросы

  • Нет связанных вопросов^_^