Пакет переменных параметров шаблона - PullRequest
3 голосов
/ 03 апреля 2020

Как мне получить пакет переменных параметров шаблона?

Примерно так:

template< ( unsigned non_type, typename type )... >

Где использование должно быть

my_class< 5U, float,
          6U, std::string >

Не знаю Я не хочу менять порядок, и при этом я не хочу иметь обертку вокруг него как пару. Очевидно, что если это превратится в какую-то пару в моей собственной внутренней реализации, это нормально.

1 Ответ

1 голос
/ 03 апреля 2020

В шаблонах следует помнить, что они , а не макросы . Они не копируют токены. Это настоящие конструкции C ++. Каждый параметр шаблона должен иметь определенный тип c: параметр типа, параметр не типового типа или параметр шаблона-шаблона, для которого должен быть указан список параметров шаблона. Тип параметра шаблона позволяет компилятору знать, имеет ли смысл использование этого параметра в определенном месте.

Например, это потенциально значимый код:

template<auto value>
auto foo() {return value + 1;}

Это очевидно ерунда:

template<typename value>
auto foo() {return value + 1;}

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

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

Конечно, это не невозможно. Например, (pack(something), ...) может быть допустимым как для типовых, так и для нетиповых параметров шаблона. Но они не будут делать то же самое. Для значений будет вызываться любой доступный operator() для типа; для типов будет вызываться конструктор для создания значения.

Наиболее полезный случай заключается в развертывании гетерогенного пакета непосредственно в список аргументов шаблона.

Однако все это это софистика, потому что шаблоны C ++ не являются макросами. Параметры шаблона должны быть четко определенного вида, чтобы компилятор мог знать, правильно ли они используются. И это включает в себя пакеты параметров. Таким образом, все элементы пакета должны быть одного вида. То, что вы хотите, называется « универсальные параметры шаблона », но в настоящее время это только предложение.

...