Недавно я узнал о существовании шаблонных параметров шаблона и теперь задавался вопросом, возможно ли что-то подобное:
template<template<class... > class Container, typename... args>
struct ContainerTemplate
{
using container = std::tuple<Container<args...>...>;
};
то, что я хочу, является шаблоном, который получает Container или какой-либо другой шаблонный шаблон в качестве параметра шаблона шаблона, а затем расширяет остальные аргументы шаблона таким образом, что если Container имеет N шаблонных аргументов и я даю шаблон N * M аргументы для args, я получаю экземпляры M-шаблонов с N шаблонами arg, например:
ContainerTemplate<std::vector, int, short, char>
//assuming std::vector takes only 1 arg for simplicity
должно привести к
container = std::tuple<std::vector<int>, std::vector<short>, std::vector<char>>
а
ContainerTemplate<std::map, int, int, short, short>
//assuming std::map takes only 2 args for simplicity
должно привести к
container = std::tuple<std::map<int, int>, std::map<short, short>>
Есть ли способ сделать это? Вопрос был бы в том, что вы могли бы узнать, сколько принимает контейнер шаблонов args или нет.
Изменить: было бы хорошо, если бы вам нужно было передать дополнительные аргументы в кортежах размера N
ContainerTemplate<std::map, std::tuple<int, int>, std::tuple<short, short>>
Edit2: поэтому я действительно нашел способ определить количество аргументов шаблона шаблона
template<typename... T>
struct TypeList
{
static const size_t Size = sizeof...(T);
template<typename T2>
struct PushFront
{
typedef TypeList<T2, T...> type_list;
};
};
template<template<class...> class Template, typename... Args>
struct SizeofTemplateTemplate
{
static const size_t Size = 0;
typedef TypeList<> type;
};
template<template<class...> class Template, typename Arg, typename... Args>
struct SizeofTemplateTemplate<Template, Arg, Args...>
{
template<typename... Args>
struct Test;
typedef char yes[1];
typedef char no[2];
template<typename... Args>
struct Test<TypeList<Args...>>
{
template<template<class...> class Template>
static yes& TestTemplate(Template<Args...>* arg);
template<template<class...> class Template>
static no& TestTemplate(...);
};
typedef typename SizeofTemplateTemplate<Template, Args...>::type::PushFront<Arg>::type_list type;
static const size_t Size = sizeof(Test<type>::TestTemplate<Template>(0)) == sizeof(yes) ? type::Size : SizeofTemplateTemplate<Template, Args...>::Size;
};
с этим, следующий код напечатает 2
std::cout << SizeofTemplateTemplate<std::vector, int, std::allocator<int>, int, int>::Size << std::endl;
Единственная проблема, с которой я столкнулся сейчас, заключается в том, что решение dyp выдает компилятор visual studio xD
Edit3: полное решение для исходного вопроса здесь: qaru.site/info/493242/...