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

Частичная специализация. Контейнеры

16.12.2012, 00:06. Показов 3229. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, пытаюсь разобраться с шаблонами:
Требуется создать функцию печати для stack, queue, priority_queue.

Все было бы супер, но не вижу общей для всех трех контейнеров функции доступа к элементам. Для стека и приоритетной очереди это top(), для очереди front() и back(). Получается, для очереди нужна специализация. Но возникает вопрос, каким образом задавать очередь при специализации, поскольку она сама является шаблоном, параметризованным типом контейнера и типом обрабатываемых элементов. Частичная специализация для функций, насколько мне известно, не работает(или я неправа?).

Подскажите, пожалуйста, способ реализации такого принта или ткните носом в тему, где освещалась подобная задача.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.12.2012, 00:06
Ответы с готовыми решениями:

Частичная специализация шаблона
Доброго всем времени суток! Помогите разобраться в следующей ситуации. Есть шаблон класса #include <iostream> ...

Частичная специализация шаблона
Может кто объяснить частичную специализацию и принцип её работы? По этой теме мало информации, а та что есть я не понял. С обычной...

Частичная специализация шаблона функции
Добрый день, помогите разобраться в чем проблема кода: template <int X, int Y> bool isSimple(){ return X%Y == 0 &&...

15
 Аватар для JlightenDev_C++
64 / 64 / 33
Регистрация: 12.08.2012
Сообщений: 151
16.12.2012, 00:59
=> iterator
0
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 15
16.12.2012, 01:07  [ТС]
И на что этот итератор будет "смотреть"? Как выставить его на первый элемент контейнера? Да и не работают вроде со стеками итераторы.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.12.2012, 01:08
похоже речь идет о свободной функции.
и возможно частичная специализация вам и не нужна, потому как для печати вроде бы как один параметр шаблонный только - это тип контейнера. в этом случае речь идет о полной специализации, но и она не сильно нужна. для функция есть еще такая штука, как перегрузка. и вот пример именно сперегрузками, а не специализацией:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <vector>
#include <list>
#include <deque>
#include <iostream>
 
template <typename T>
void print(const T&)
{
   std::cout << "common print" << std::endl;
}
 
template <typename T>
void print(const std::vector<T>&)
{
   std::cout << "vector<T> print" << std::endl;
}
 
void print(const std::vector<char>&)
{
   std::cout << "vector<char> print" << std::endl;
}
 
int main()
{
   print(std::list<int>());
   print(std::deque<int>());
   print(std::vector<int>());
   print(std::vector<void*>());
   print(std::vector<char>());
   return 0;
}
если это не то, что надо, то непонятно, что вам надо. нужно больше инфы
1
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 15
16.12.2012, 01:17  [ТС]
Спасибо, но, как мне кажется, не совсем то.
Задание дословно "Напишите шаблон функции для вывода значений stack, queue, priority_queue".

То есть по видимому нужен механизм, позволяющий использовать единый синтаксис для печати каждой из перечисленных сущностей. Нечто вроде:
C++
1
2
3
4
5
6
7
8
...
    stack<int, vector<int>> sv;
    queue<int, list<int>> qd;
    priority_queue<int, vector<int>, less<int>> pql;
...
    Print(sv);
    Print(qd);
    Print(pql);
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
16.12.2012, 01:20
а вот это разве не единый синтаксис?
C++
1
2
3
4
5
  print(std::list<int>());
  print(std::deque<int>());
  print(std::vector<int>());
  print(std::vector<void*>());
  print(std::vector<char>());
вызывается функция принт. ей передается объект контейнера.
можно переписать так:

C++
1
2
3
4
5
6
7
8
9
10
11
std::list<int> c1;
std::deque<int> c2;
std::vector<int> c3;
std::vector<void*> c4;
std::vector<char> c5;
 
  print(с1);
  print(с2);
  print(с3);
  print(с4);
  print(с5);
0
 Аватар для JlightenDev_C++
64 / 64 / 33
Регистрация: 12.08.2012
Сообщений: 151
16.12.2012, 01:22
Цитата Сообщение от little_blond Посмотреть сообщение
И на что этот итератор будет "смотреть"? Как выставить его на первый элемент контейнера? Да и не работают вроде со стеками итераторы.
.begin() & .end()
0
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 15
16.12.2012, 01:30  [ТС]
DU,
да, все верно, спасибо! Не увидела сначала перегруженную функцию
C++
1
2
3
4
5
template <typename T>
void print(const std::vector<T>&)
{
   std::cout << "vector<T> print" << std::endl;
}
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.12.2012, 01:53
Цитата Сообщение от little_blond Посмотреть сообщение
Получается, для очереди нужна специализация.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//---------------------------------------------------------------------------
template <class C>
print(C c)
{
    while(!c.empty())
     {
         std::cout<<c.top()<<" ";
         c.pop();
     }
}
//---------------------------------------------------------------------------
template <class T>
print(std::queue<T> c)
{
    while(!c.empty())
     {
         std::cout<<c.front()<<" ";
         c.pop();
     }
}
//---------------------------------------------------------------------------
int main()
{
using namespace std;
 
stack<int> s;
 
s.push(1);
s.push(2);
s.push(3);
 
queue<int> q;
 
q.push(1);
q.push(2);
q.push(3);
 
priority_queue<int> pq;
 
pq.push(1);
pq.push(2);
pq.push(3);
 
 
print(s);  cout<<endl;
print(q);  cout<<endl;
print(pq); cout<<endl;
 
return 0;
}
3 2 1
1 2 3
3 2 1
1
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 15
16.12.2012, 11:12  [ТС]
Avazart,
спасибо за ответ!

То есть в параметре очередь, являющаяся шаблоном от двух параметров, ( например, queue<int, list<int>>), может быть упомянута в функции как шаблон одного параметра? (queue<T>). Это было бы удобно.

Но у меня 2005 студия такой код не проглотила, ругается:
"error C2995: 'void Print(Ta &)' : function template has already been defined"

И действительно, разве такой синтаксис используется при специализации? Больше похоже на два разных шаблона с одинаковым списком параметров.

Мб дело в престарелом компиляторе? Помогите, пожалуйста, разобраться.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.12.2012, 13:12
Ну я позабыл void понаписывать в возвращаемые значения
C++
1
2
3
4
5
6
7
//---------------------------------------------------------------------------
template <class C>
void print(C& c);
//---------------------------------------------------------------------------
template <class T>
void print(std::queue<T>& c);
//--------------------------------------------------------------------------
А вообще пример компилится на VC++2010 ( изначально писал на Builder2009)

Добавлено через 1 минуту
Цитата Сообщение от little_blond Посмотреть сообщение
И действительно, разве такой синтаксис используется при специализации? Больше похоже на два разных шаблона с одинаковым списком параметров.
Честно говоря не знаю можно ли это назвать специализацией, скорее всего перегрузка как и прошлом варианте.
1
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 15
16.12.2012, 13:58  [ТС]
void я добляла, дело не в нем. Буду пробовать в VS 2010, спасибо
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.12.2012, 14:22
Два раза JlightenDev_C++ сказал про итераторы. Нееет, мы будем писать костыли через top, front и прочую ерунду.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <vector>
#include <deque>
#include <set>
#include <utility>
 
template <class Container>
void print(const Container& c, std::ostream& stream = std::cout)
{
    for(const auto& elem: c)
        stream << elem << ' ';
}
 
int main()
{
    std::vector<int>    v{1, 2, 3};
    std::deque<int>     d{3, 2, 1};
    std::set<int>       s{2, 3, 1};
 
    print(v);
    std::cout << std::endl;
 
    print(d);
    std::cout << std::endl;
 
    print(s);
    std::cout << std::endl;
 
    return 0;
}
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.12.2012, 14:25
soon, Аля какие итераторы в стеке и очереди ? они закрыты ...
2
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
16.12.2012, 14:38
Ладушки, мой косяк. Извините.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.12.2012, 15:20
К сожалению, в случае специализации шаблона функции все оказывается несколько сложнее по двум основным причинам.

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

Специализации шаблона функции никогда не участвуют в перегрузке. Таким образом, любая написанная вами специализация никак не повлияет на результат разрешения перегрузки и выбор используемого шаблона. Это противоречит интуитивно ожидаемому поведению разрешения перегрузки. Но, в конце концов, если вы напишете нешаблонную функцию с идентичной сигнатурой вместо специализации шаблона функции, то при разрешении перегрузки будет выбрана именно нешаблонная функция, как имеющая преимущество перед шаблоном.
http://www.programmer-lib.ru/c... .php?id=30

Собственно я так и не пойму как отличить одно от другого ...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.12.2012, 15:20
Помогаю со студенческими работами здесь

Для чего нужна частичная специализация шаблона класса?
Доброго времени суток объясните пожалуйста зачем нужна частичная специализация шаблонов класса

Каким стандартом введена частичная специализация шаблона функции?
привет, сабж ясен из заголовка

Специализация конструктора:
template &lt;int N&gt; class static_str { char data; } class A { template &lt;typename T&gt; A(T t){};

Специализация шаблона
Всем доброго вечера! Возникает непонятная ошибка при создании специализации родового класса cl. В строке 10: template class...

Явная специализация
Здрасти, Народ. Подскажите плз в чем преимущество явной специализации перед перед обычным применением перегруженной функции. Привожу...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru