Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 51

Шаблоны типа template<class T*>

21.06.2017, 18:15. Показов 4925. Ответов 31

Здравствуйте, объясните пожалуйста, что означает сия запись: template<class T*>.
И означает ли она, что я далее смогу использовать только указатель на объект, а не сам объект?

Т.е. пусть, например, у меня есть класс:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
template<class T*>
class MyClass {
private:
    T info; //info в данном случае является указателем на T, или самим объектом T?
 
    ...
};
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.06.2017, 18:15
Ответы с готовыми решениями:

подскажите template<class> (Шаблоны и указатели)
circl.h #ifndef _CIRCL_H #define _CIRCL_H template &lt;class t&gt; class circl{ private: circl *pNext,*pBack; public: t...

Friend template class with template class argument
Помогите подружить 2 класса: Имеется класс Student: template &lt;class _T&gt; class Faculty; class Student{ friend...

Не пойму конструкцию template <template <class T> class X>
Что это за шаблон такой?

31
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
21.06.2017, 20:50
Цитата Сообщение от Twolka Посмотреть сообщение
Но ведь тогда наш класс как минимум две функции(или перегрузку одной) копирования, если я правильно вас понял.
Не понял. Если у вас
C++
1
2
3
class Probe {
//определён конструктор копирования и оператор присваивания
};
то тогда просто копируете/присваиваете экземпляры класса Probe, как обычно. Как конкретно происходит копирование/присваивание уже забота класса Probe.
0
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 51
21.06.2017, 21:38  [ТС]
Цитата Сообщение от Twolka Посмотреть сообщение
Ух ты, оказывается, в шаблоны можно и указатели на функции "cовать".
На эту чушь не смотрите, я уже понял, что ошибся в понимании кода). Но выглядит это офигенно.

Добавлено через 3 минуты
Цитата Сообщение от gray_fox Посмотреть сообщение
то тогда просто копируете/присваиваете экземпляры класса Probe, как обычно. Как конкретно происходит копирование/присваивание уже забота класса Probe.

Вот есть такая штука
C++
1
2
3
4
5
6
7
8
template<class T>
class node {
private:
    int size;
    int keys[2];
    T info[2];
    node<T> *sons[3];
...
Я ведь могу создать класс
C++
1
2
3
4
5
int main() {
    node<Probe> t; //так
    node<Probe*> t2; //или так
    return 0;
}
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
21.06.2017, 21:50
Цитата Сообщение от Twolka Посмотреть сообщение
Я ведь могу создать класс
Можете (только не "создать класс", а экзепляры класса (t, t2)). А в чём вопрос?
0
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 51
21.06.2017, 21:57  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
Можете (только не "создать класс", а экзепляры класса (t, t2)). А в чём вопрос?
Пусть мы хотим написать функцию, копирующую дерево (т.е. все node, которые являются сыновьями данного node)
у нас же не будет единой функции для копирования дерева, т.к мы не знаем, дан ли нам указатель на объект или сам объект. Или я в чём-то Оочень сильно заблуждаюсь?
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
21.06.2017, 22:11
Цитата Сообщение от Twolka Посмотреть сообщение
Пусть мы хотим написать функцию, копирующую дерево (т.е. все node, которые являются сыновьями данного node)
у нас же не будет единой функции для копирования дерева, т.к мы не знаем, дан ли нам указатель на объект или сам объект.
Я вам предлагаю иметь одну функцию, которая не знает, какой именно тип ей передали в качестве аргумента шаблона и просто копирует объекты (по значению) в процессе копирования вашего шаблона класса. Если клиенту (тому, кто использует ваш шаблон класса node, им можете быть и вы) надо, что бы всё корректно копировалось, то он это должен сам обеспечить.
Иначе вам придется в шаблоне класса node учитывать специальные случаи для указателей, возможно даже специальные случаи для указателей на определённые типы и т.п.
1
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 51
21.06.2017, 22:32  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
Я вам предлагаю иметь одну функцию, которая не знает, какой именно тип ей передали в качестве аргумента шаблона и просто копирует объекты (по значению) в процессе копирования вашего шаблона класса. Если клиенту (тому, кто использует ваш шаблон класса node, им можете быть и вы) надо, что бы всё корректно копировалось, то он это должен сам обеспечить.
Иначе вам придется в шаблоне класса node учитывать специальные случаи для указателей, возможно даже специальные случаи для указателей на определённые типы и т.п.
Но всё же тогда пользователю придётся переопределять операцию присваивания для указателя? Это как-то странно... Как тогда присвоить обычному указателю на этот класс что-то? Здесь мы теряем одну полезную операцию из 2.
Не лучше ли попытаться создать специализацию класса node(если это возможно), а лучше функций копирования дерева? А причин создания специальных случаев для указателей я не вижу - указатель и есть указатель, функция копирования дерева для него просто будет разыменовывать указатель и копировать объект, а потом возвращать указатель на новый объект.
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
21.06.2017, 22:50
Цитата Сообщение от Twolka Посмотреть сообщение
Но всё же тогда пользователю придётся переопределять операцию присваивания для указателя?
Нет. Ему надо будет иметь тип, который умеет копироваться.

Для примера, строки можно хранить "a-la C", т.е. под строку выделяется блок памяти, используется, потом удаляется:
C++
1
2
3
4
5
char * string = new char[string_size];
 
// ...
 
delete[] string;
Для копирования и присваивания (и многих других операций над строками) надо использовать определённые функции (strcpy для копирования, например), динамической памятью надо управлять в ручную (new[]/delete[] на каждом шагу).

С другой стороны, можно использовать класс std::string, который по сути то же самое (так же выделяется/освобождается динамическая память, например), но все эти детали скрыты внутри класса и объекты std::string можно использовать как "обычные" типы (int, например). Можно использовать оператор = для присвоения одной строки другой и не заботиться о таких деталях как как конкретно происходит операция присвоения - просто пишем string1 = string2, и в string1 будет копия string2.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
21.06.2017, 23:01
Twolka, для начала напишите дерево, в котором в качестве данных узла будет например поле int (всего одно). Оттестируйтесь на нём, проверьте, работоспособно ли оно. А далее делаете объявление шаблона класса (template <class T>) и превращаете поле типа int в поле типа T . И всё. Далее компилятор будет автоматически генерировать вам дерево под любой нужный вам тип или структуру с данными. А алгоритмы дерева останутся такими же.
1
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 51
21.06.2017, 23:12  [ТС]
Ваш пример, конечно же, хорош, но как он связан с ситуацией, когда нужно иметь 2 разных алгоритма копирования - для указателей и для объектов? Здесь должен не класс T уметь по-особому копироваться(хотя если в нём есть указатель, он должен уметь), а именно должно быть 2 алгоритма: для копирования по указателю, и без него.

Мне кажется вот что здесь подойдёт: (когда смотрел на эти строки днём - всё совсем по другому понимал)

Цитата Сообщение от MrGluck Посмотреть сообщение
Бред какой-то. Может вы путаете с частичной специализацией шаблона для указателей?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class T>
struct Foo
{
* * Foo() { std::cout << "1"; }
};
template <class T>
struct Foo<T*>
{
* * Foo() { std::cout << "2"; }
};
int main()
{
* * Foo<int*>();
}
Добавлено через 3 минуты
Цитата Сообщение от TRam_ Посмотреть сообщение
Twolka, для начала напишите дерево, в котором в качестве данных узла будет например поле int (всего одно). Оттестируйтесь на нём, проверьте, работоспособно ли оно. А далее делаете объявление шаблона класса (template <class T>) и превращаете поле типа int в поле типа T . И всё. Далее компилятор будет автоматически генерировать вам дерево под любой нужный вам тип или структуру с данными. А алгоритмы дерева останутся такими же.
Да вот проблема в том, что если будет работать для int, то не обязательно будет работать для int*...

Добавлено через 1 минуту
Кстати, я написал для int(почти полностью), но вот шаблоны меня вгоняют в ступор из-за таких различий
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
21.06.2017, 23:17
Цитата Сообщение от Twolka Посмотреть сообщение
Ваш пример, конечно же, хорош, но как он связан с ситуацией, когда нужно иметь 2 разных алгоритма копирования - для указателей и для объектов? Здесь должен не класс T уметь по-особому копироваться(хотя если в нём есть указатель, он должен уметь), а именно должно быть 2 алгоритма: для копирования по указателю, и без него.
Так я вам в который раз уже пишу, что проще иметь один алгоритм (для объектов)
Иначе для каждого типа указателя надо будет писать свой алгоритм, насколько я понимаю.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
21.06.2017, 23:22
Цитата Сообщение от Twolka Посмотреть сообщение
Да вот проблема в том, что если будет работать для int, то не обязательно будет работать для int*...
почему же? Делаете массив, создаёте дерево указателей на некоторые элементы этого массива, и вуаля - всё работает . Вот только особого толку от такого подхода (с от самого дерева местом хранения данных) будет мало, если размер элементов массива мал.
1
0 / 0 / 0
Регистрация: 16.03.2017
Сообщений: 51
22.06.2017, 16:52  [ТС]
Цитата Сообщение от gray_fox Посмотреть сообщение
Так я вам в который раз уже пишу, что проще иметь один алгоритм (для объектов)
Иначе для каждого типа указателя надо будет писать свой алгоритм, насколько я понимаю.
Ох.. мне кажется мы с вами немного не понимаем друг друга
Давайте попробую в коде показать, что я предлагаю:
(извиняюсь за ошибки, со специализациями не был знаком, думаю вы поймёте)
C++
1
2
3
4
5
6
7
8
9
template<class T>
T &copy(const T &from) {
    return *new T(from);
}
 
template<class T>
T *copy<T*>(T *from) {
    return new T(*from);
}
Вот. Вот эта функция будет использоваться в функции копирования дерева. И никакого отдельного алгоритма для каждого указателя не нужно.

Цитата Сообщение от gray_fox Посмотреть сообщение
Так я вам в который раз уже пишу, что проще иметь один алгоритм (для объектов)
А вот единый алгоритм, делающий то же самое для объекта мы никак не создадим.

Добавлено через 2 минуты
Цитата Сообщение от TRam_ Посмотреть сообщение
почему же? Делаете массив, создаёте дерево указателей на некоторые элементы этого массива, и вуаля - всё работает . Вот только особого толку от такого подхода (с от самого дерева местом хранения данных) будет мало, если размер элементов массива мал.
Проблема в том, что "вуаля" не сработает - в той же функции копирования мы просто скопируем указатели, и всё.

Добавлено через 2 минуты
Ну серьёзно.. если мы останемся с одним алгоритмом, то указатели и сами будут восприниматься как объекты, которые мы храним

Добавлено через 23 минуты
Так. Код выше не заработает никогда - только что прочитал, что специализация функций не допустима.
Но зато аналогичный (по моему мнению) код закомпилился и работает так, как нужно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
template <class T>
void foo(T a) {
    std::cout << "1" << std::endl;
}
 
template <class T>
void foo(T* a) {
    std::cout << "2" << std::endl;
}
 
int main()
{
    int a = 2;
    foo(&a);
}
Добавлено через 16 часов 51 минуту
Ладно, насчёт "оставить всё на плечах пользователя" вы, наверное, правы. Мне сегодня объяснили, что дерево не для хранения лучше использовать .
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.06.2017, 16:52

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я прописываю тело функций внутри описания...

'MyQueue' : use of class template requires template argument list
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки 'MyQueue' : use of class template...

В чем различие template <typename T> от template <class T> ?
Добрый день ! Заметил в новых книгах применение записи template &lt;typename T&gt; вместо template &lt;class T&gt; в чем же тогда фишка...

template <class T>
Куда вставлять template &lt;class T&gt; при определении функций, принимающих аргументы типа &quot;класс&quot;?дружественных фунгкций и вообще...

Template class
Возможно ли разделить шаблонный класс на два файла так, что в одном из файлов буду объявления, а в другом определения членов класса? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru