Является ли пакет параметров параметром шаблона? - PullRequest
2 голосов
/ 22 мая 2019

cppreference пишет, что пакет параметров шаблона является параметром шаблона:

https://en.cppreference.com/w/cpp/language/parameter_pack

Это правда?Например, правильно ли написать что-то вроде этого:

template<typename... Ts>
class MyClass {
    std::unique_ptr<Ts...> m_data;
};

Ответы [ 3 ]

1 голос
/ 22 мая 2019

Да, пакет параметров является допустимым шаблоном параметр , который используется в объявлении .Но когда шаблон создан , он заменяется списком фактически предоставленных шаблонов аргументов , см. https://en.cppreference.com/w/cpp/language/template_parameters

Например, в вашем примере MyClass<int> будет содержатьstd::unique_ptr<int>, MyClass<int, MyDeleter> будет содержать std::unique_ptr<int, MyDeleter>, а MyClass<int, MyDeleter, Foo> вызовет ошибку компилятора «неправильное количество аргументов шаблона», поскольку std::unique_ptr может иметь не более двух из них.

0 голосов
/ 27 мая 2019

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

За [temp.variadic] / 1 :

Пакет параметров шаблона - это параметр шаблона, который принимает ноль или больше аргументов шаблона.

Так что да, пакет параметров шаблона является параметром шаблона. Отправленный вами фрагмент кода верен.

0 голосов
/ 22 мая 2019

Конечно, думайте об этом, как будто вы записали последовательность типов при создании экземпляра MyClass (должно быть template<typename... T> class MyClass; btw), а затем эта последовательность была точно скопирована в экземпляр std::unique_ptr. std::unique_ptr принимает до двух параметров, а второй является чем-то особенным, поэтому не все будет работать:

int main() {
        MyClass<int> this_compiles;
        MyClass<int, std::default_delete<int>> as_does_this;
        //MyClass<int, double, char> this_does_not;
        //MyClass<> this_neither;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...