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

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

16.12.2012, 00:06. Показов 3260. Ответов 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
8489 / 6156 / 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
8489 / 6156 / 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
8489 / 6156 / 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
8489 / 6156 / 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
Ответ Создать тему
Новые блоги и статьи
Вот уже год прошел, как у меня домен в reg.ru ...
Etyuhibosecyu 16.04.2026
И ничего они мне не сделали. Если отвязать карту, никакие услуги они не навяжут. Я бы с радостью продлил еще на два года, чтобы не мучиться с временным доменом и меня уже знали по red-star-soft. com,. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru