у меня есть большое домашнее задание по шаблонам, и часть его создания структуры 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
... Я никогда не видел ничего подобного, поэтому могу только догадываться, как это можно сделать.
Итак, я хорошо думаю об этой проблеме, или я должен подойти к ней как-то иначе? Я был бы признателен за любую помощь (а не только за полное решение) - любые полезные ссылки приветствуются.
Какой C++ стандартной версии вы позволили использовать? 'constexpr' означает C++ 11 или новее. – melak47
@ melak47 Тег C++ относится к последнему стандарту C++. – edmz
Я даже могу использовать C++ 17, я хочу, чтобы – qiubit