Сейчас на форуме: jinoweb (+4 невидимых)

 eXeL@B —› Программирование —› C++ class templates syntax
Посл.ответ Сообщение


Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 07 июня 2020 02:13 · Поправил: plutos
· Личное сообщение · #1

Вопросы к знатокам С++ и class templates syntax.
Начиная с C++11 появились вот такие definitions of std::unique_ptr

Code:
  1. template<class T,class Deleter = std::default_delete<T>> class unique_ptr;

AND (для манипуляций с array'eм):
Code:
  1. template <class T, class Deleter> class unique_ptr<T[], Deleter>;

С первым определением все ясно, а вот синтакс второго не доходит, конкретно вот эта часть: class unique_ptr<T[], Deleter>.
Ведь по идее должно быть:
Code:
  1. template <class T>
  2. class className 
  3. {
  4.    ... .. ...
  5. public:
  6.    T var;
  7.    T someOperation(T arg);
  8.    ... .. ...
  9. };

className в данном случае "unique_ptr", а остальное в <...>?

должно быть что-то вроде
Code:
  1. template <class T[], Deleter> class unique_ptr;


Я понимаю, что это template arguments, понимаю зачем этот класс и что он делает, вопрос только ПОЧЕМУ ИСПОЛьЗУЕТСЯ ТАКОЙ SYNTAX?
Перелопатил кучу источников, начиная с cppreference.com, но ответа не нашел.

Вопрос номер два: я нашел в header file "memory" declarations первого варианта (для версий 14.24.28314 и 14.16.27023), а вот второй вариант (для array T[]) нигде не могу найти. Подскажите, кто знает.

И последний вопрос: если возможность просматривать код после того как template arguments уже были substituted конкретными параметрами? Ну вроде как macro expansion after preprocessor'a?
Заранее спасибо!

-----
Give me a HANDLE and I will move the Earth.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 07 июня 2020 10:01
· Личное сообщение · #2

unique_ptr может работать не только с инстансами классов, но и с массивами. Соответственно, если оператор delete element; выглядит так для инстанса, то для массива - delete[] element, и следует вывод, что deleter будет в общем случае разный. Потому есть перегрузка для T[], где инстанцирование T приводит к работе с массивом.

-----
Stuck to the plan, always think that we would stand up, never ran.


| Сообщение посчитали полезным: plutos


Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 07 июня 2020 19:56
· Личное сообщение · #3

--> Link <--




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 08 июня 2020 00:52
· Личное сообщение · #4

ARCHANGEL пишет:
Потому есть перегрузка для T[]


т.е, если я правильно понял

Code:
  1. template <class T, class Deleter> class unique_ptr<T[], Deleter>;


это overload syntax?

-----
Give me a HANDLE and I will move the Earth.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 08 июня 2020 01:19 · Поправил: reversecode
· Личное сообщение · #5

нет
это частичная специализация

ютуб забит учебными курсами по С++, потрудитесь продолжать учиться там

| Сообщение посчитали полезным: plutos


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 08 июня 2020 02:11
· Личное сообщение · #6

--> Link <--
Разрешение перегрузки, но через частичную специализацию. Ну и reversecode в чём-то прав, в учебниках это есть.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 08 июня 2020 02:37 · Поправил: plutos
· Личное сообщение · #7

reversecode пишет:
это частичная специализация

ну вот, теперь, когда знаю название, потрудился и нашел ответ! Спасибо на добром слове, reverscode!

A про АРХАНГЕЛА могу сказать одно: как жаль, что он так редко стал заходить на форум.
Раньше читаешь его посты и отдыхаешь душой, словно какое-то звездное мерцание...
Копируешь его пост и прямым ходом на Хабр! Под своим именем естественно...

-----
Give me a HANDLE and I will move the Earth.



 eXeL@B —› Программирование —› C++ class templates syntax
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати