2015-12-01 2 views
1

у меня есть большое домашнее задание по шаблонам, и часть его создания структуры template <typename... Types> struct Foo, которая содержит публичную структуру template<typename Type> struct Bar, какие акции (в общественном type определении) структуру, в которой мы должны включить публичный метод template<typename Type> static constexpr size_t count();, который выводит 1, если тип был указан в аргументах Foo и Bar или 0 в противном случае. Пример (следующий код компилируется):Добавление шаблона специализации для всех типов данных в VARIADIC шаблоне

using FooBar = Foo<foo1,foo2,foo3>; 

using Foo1Type = FooBar::Bar<foo1>::type; 
// foo1 was given as argument to Foo and Bar 
static_assert(Foo1Type::count<foo1>() == 1); 
// foo2 was given as argument to Foo, but not Bar 
static_assert(Foo1Type::count<foo2>() == 0); 

using Foo4Type = FooBar::Bar<foo4>::type; 
// foo4 was not given as argument to Foo 
static_assert(Foo4Type::count<foo4>() == 0); 
static_assert(Foo4Type::count<foo1>() == 0); 

Это выглядит довольно хардкор для меня (я новичок в шаблоны, только начал читать abount них), кажется, что мы должны перебрать аргументы шаблона к переменному числу Foo, и во время итерации каким-то образом создаются новые специализации для внутренней структуры Bar ... Я никогда не видел ничего подобного, поэтому могу только догадываться, как это можно сделать.

Итак, я хорошо думаю об этой проблеме, или я должен подойти к ней как-то иначе? Я был бы признателен за любую помощь (а не только за полное решение) - любые полезные ссылки приветствуются.

+0

Какой C++ стандартной версии вы позволили использовать? 'constexpr' означает C++ 11 или новее. – melak47

+0

@ melak47 Тег C++ относится к последнему стандарту C++. – edmz

+0

Я даже могу использовать C++ 17, я хочу, чтобы – qiubit

ответ

1

Как я понимаю, ваша внутренняя функция просто что-то вроде:

return contain<Type, TBar>{} && contain<Type, TFoos...>{}; 

и что структуры содержат может быть записано как:

template <typename T, typename ... Ts> struct contain; 

// Partial specializations 
// Empty case 
template <typename T> struct contain<T> : std::false_type {}; 

// Found 
template <typename T, typename ... Tail> 
struct contain<T, T, Tail...> : std::true_type {}; 

// Not found, iterate the list 
template <typename T, typename Head, typename ... Tail> 
struct contain<T, Head, Tail...> : contain<T, Tail...> {}; 

Demo

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