Можно ли создать список параметров шаблона шаблона? - PullRequest
0 голосов
/ 18 сентября 2018

Мне было интересно, возможно ли создать список, содержащий параметры шаблона шаблона, например

template <
    template <typename...> class TTP0,
    template <typename...> class... TTPs
>
struct TTP_List : TTP_List<TTPs...> {};

Проблема, с которой я столкнулся, заключается в том, что я не знал хорошего способа доступа к элементам списка, чтоесть, TTP0.Я хотел бы использовать псевдонимы типа typedef или using.Однако я знаю, что это невозможно, поскольку параметры шаблона шаблона не являются типами и поэтому не должны рассматриваться как таковые.

Подход, который я мог бы себе представить, заключается в создании явных структур для чтения данных и использования их специализаций, например:

template <template <typename...> class>
struct container_TTPs;

template <template <typename...> class TTP>
struct container_TTPs<std::vector> {};

Однако этот подход кажется очень явным.Есть ли способ добиться этого признания без использования специализации шаблонов?

Не стесняйтесь спрашивать, нужно ли мне уточнить.

РЕДАКТИРОВАТЬ: Например, я хочу иметь возможность использовать определенныевыражения для каждого удерживаемого типа, такие как TestClass<TTP_List<std::vector, std::list>>::value, где TestClass использует std :: vector и std :: list, не требуя шаблона с переменным числом в пределах TestClass, так что можно передать несколько TTP_List s.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Я не понимаю, что вы имеете в виду под "доступом к элементам списка".

Мне кажется, что вы должны дать нам пример того, что вы хотите, конкретно, делать доступ к элементамсписка.

В любом случае, поскольку вы можете использовать using для «доступа» (?) typenames

template <typename T0, typename ... Ts>
struct foo 
 { 
   using type = T0;
 };

, вы можете использовать шаблон using для «доступа» (?) параметр шаблона-шаблона выглядит следующим образом

template <template <typename...> class T0, 
          template <typename...> class ... Ts>
struct foo 
 { 
   template <typename ... As>
   using templ_type = T0<As...>;
 };

, и вы можете использовать его следующим образом

// vi is a std::vector<int>
foo<std::vector, std::set, std::map>::templ_type<int> vi { 0, 1, 2 };
0 голосов
/ 18 сентября 2018

Проблема (проблема) заключается в том, что список переменных параметров шаблона (не важно, если имя типа, значений или шаблонов) должен быть в последней позиции.

Итак

template <typename ... Ts, typename T0>
struct foo 
 { };

неверно, поскольку Ts... должно быть в последней позиции, а

template <typename T0, typename ... Ts>
struct foo 
 { };

правильно.

С параметрами шаблона-шаблона,

template <template <typename ...> class ... Ts,
          template <typename ...> class T0>
struct foo 
 { };

неверно, если

template <template <typename ...> class T0,
          template <typename ...> class ... Ts>
struct foo 
 { };

правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...