Как указать пакеты параметров, которые принимают любой тип или значение?

При указании пакетов параметров для типа я хочу иметь возможность принимать не только typename, но и значения произвольных типов. Пример:

template <thing... Things>
//        ^^^^^   <- pseudo code
struct Example {};

Example<int,bool>();
Example<4,float,'x'>();

Ясно, что thing не является допустимым ключевым словом C++, но возможна ли идея, выраженная здесь?


Контекст для этого заключается в том, что у меня есть адаптер контейнера, который хочет вставить свой собственный тип значения в контейнер, но позволяет передавать любые дополнительные параметры шаблона, а некоторые контейнеры получают не только аргументы типа, но и значения (std::array будет популярным примером) .

template <template <typename...> typename Container, typename... Args>
struct Adapter {
  struct Node { /* ... */ };
  Container<Node,Args...> container;
};

Adapter<std::vector>(); // fine
Adapter<std::vector,MyAllocator>(); // fine
Adapter<std::array,3>(); // nope because 3 is not a typename

person bitmask    schedule 20.08.2020    source источник
comment
На данный момент это невозможно (насколько я знаю, С++ 17, но также и С++ 20). Лучшее, что я могу предложить, это обернуть значения внутри класса (например: не 3, а std::integral_constant<int, 3>).   -  person max66    schedule 20.08.2020
comment
@ max66 Да, я тоже думал о чем-то вроде integral_constant, но для этого потребовалось бы, чтобы базовые типы принимали это, чего (например) std::array нет. И не могло быть даже перегрузки по той же причине.   -  person bitmask    schedule 20.08.2020
comment
Предполагая, что вы знаете возможные переданные значения, не можете ли вы просто использовать void *, а затем попытаться прочитать его как все возможные значения, чтобы найти допустимые? В противном случае попробуйте это   -  person Sarwagya    schedule 20.08.2020