В шаблонах следует помнить, что они , а не макросы . Они не копируют токены. Это настоящие конструкции C ++. Каждый параметр шаблона должен иметь определенный тип c: параметр типа, параметр не типового типа или параметр шаблона-шаблона, для которого должен быть указан список параметров шаблона. Тип параметра шаблона позволяет компилятору знать, имеет ли смысл использование этого параметра в определенном месте.
Например, это потенциально значимый код:
template<auto value>
auto foo() {return value + 1;}
Это очевидно ерунда:
template<typename value>
auto foo() {return value + 1;}
Компилятору даже не нужно ждать, пока вы создадите экземпляр шаблона, чтобы закрыть его.
Единственный способ использовать пакет параметров - это развернуть его в какое-то место. А при расширении пакета параметров шаблон, который использует пакет, применяется к всем элементам пакета. Очень сложно построить сценарий, в котором типы и значения могут вписываться в синтаксис шаблона.
Конечно, это не невозможно. Например, (pack(something), ...)
может быть допустимым как для типовых, так и для нетиповых параметров шаблона. Но они не будут делать то же самое. Для значений будет вызываться любой доступный operator()
для типа; для типов будет вызываться конструктор для создания значения.
Наиболее полезный случай заключается в развертывании гетерогенного пакета непосредственно в список аргументов шаблона.
Однако все это это софистика, потому что шаблоны C ++ не являются макросами. Параметры шаблона должны быть четко определенного вида, чтобы компилятор мог знать, правильно ли они используются. И это включает в себя пакеты параметров. Таким образом, все элементы пакета должны быть одного вида. То, что вы хотите, называется « универсальные параметры шаблона », но в настоящее время это только предложение.