Форум программистов, компьютерный форум CyberForum.ru

Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
15.12.2011, 23:25     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? #1
собсно
C++
1
2
3
4
5
6
7
8
9
10
template <class T>
class perestanovki {
 
 public:
  T<int> v;
  
};
 
int main () {
}
А в реальной жизни вместо T будет например, vector
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2011, 23:25     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона?
Посмотрите здесь:

C++ необходимо в шаблонном классе, один из параметров которого контейнер, объявить итератор этого контейнера
C++ Параметры в шаблонном классе
C++ Ошибка в шаблонном классе
Итераторы, как параметры лябда-функций в шаблонном классе C++
C++ Шаблонный конструктор в шаблонном классе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2011, 23:34     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? #2
надо смотреть в сторону шаблоных параметров шаблонов. но заюзать стл контейнеры переносимо не получится. все потому, что у них не стандартизировано количество параметров по умолчанию.

C++
1
2
3
4
5
template <template <typename> class Cont>
struct X
{
   Cont<int> m_cont;
};
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
15.12.2011, 23:59  [ТС]     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? #3
Синтаксис понятен, а объяснение непонятно. Ну то есть я понял, что это вот не должно работать и оно не работает

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <vector>
using namespace std;
 
template <template <class> class t>
struct str {
 t<int> v;
};
 
int main () {
 str <vector> x;
 
 //ну или так
 //str <vector <int> > x;
}
а почему не работает- непонятно. Чё мешает создаться такой структуре?
struct perestanovki {
vector<int> v;
};
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.12.2011, 00:10     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? #4
C++
1
template <template <class> class t>
тут указано что у шаблонного параметра шаблона должен быть один параметр. а у стл контейнеров после необходимого типа элемента, который в контейнере хранится идут дефолтные параметры всяких аллокаторов и прочее. вот спискок этих дефолтных параметров не стандартизирован, а шаблоный параметр шаблона требует, чтобы количество перечисленных параметров шаблона совпадало с количеством параметров того шаблона, которым параметризируется ваш хитрый класс.
посмотрите на файл, где у вас вектор определен. если у него два параметра, то попробуйте начать свой шаблон с такой строчкой:

C++
1
template <template <class, class> class t>
может с новым стандартом что-то улучшили с шаблонами. я этого не знаю.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
16.12.2011, 00:57  [ТС]     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? #5
Чудо свершилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <vector>
#include <stack>
#include <list>
#include <queue> 
 
using namespace std;
 
template <template <class, class> class t, class T>
struct str {
 t<T, allocator<T> > v;
};
 
int main () {
 str <vector, int> x;
 str <stack,  int> y;
 str <list,   int> z;
 str <queue,  int> a;
}
Здесь ещё глянул. Чё будет дальше не знаю, если чё отпишусь
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
17.12.2011, 03:15  [ТС]     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? #6
Но теперь не понять, почему не компилится это вот:
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
#include <windows.h>
#include <vector>
#include <stack>
#include <deque>
using namespace std;
 
 
//T предназначена заменять собой "Сишный" тип, вроде int или float 
//t заменяет контейнер, например, vector или stack
//t_ заменяет второй параметр параметра t
//Проще говоря, вот шаблон для вектора 
//template < class T, class Allocator = allocator<T> > class vector;
 
//а вот для стека 
//template < class T, class Container = deque<T> > class stack;
 
 
template <class T, template <class, class > class t, template <class> class t_ >
class klass {
 public:
  klass (t<T, t_<T> >& prom) {;}
};
 
 
         //+++++++++++++++++++++++++++++++++++++++++++++++++//
 
 
int main () {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 //Тут всё нормально компилится
 vector <int> vec;
 klass<int, vector, allocator> klass_(vec);
 
 stack <int> stac;
 
 //А тут нет
 //klass<int, stack, deque > klass__(stac);
 
 return 0;
}
Вот здесь стандарт шаблона класса vector,
А здесь шаблона класса stack

Видно, что если использую вектор, то надо писать allocator, что я и делаю, а если стек, то надо писать deque. Но во втором случае почему-то не компилится.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.12.2011, 04:24     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? #7
kravam, Дек как бэ тоже с аллокатором.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
17.12.2011, 05:22  [ТС]     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? #8
У меня второй контейнер не очередь, а стек. Доля него первый параметр это int, второй сам stack, а третий берём отсюда:
template < class T, class Container = deque<T> > class stack; Так что всё верно, надо писать
C++
1
 klass<int, stack, deque > klass__(stac);
хотя
C++
1
klass<int, stack, allocator> klass__(stac)
не компилится тоже
LosAngeles
Заблокирован
17.12.2011, 08:03     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? #9
как уже выше сказали deque не подходит
C++
1
2
3
4
// TEMPLATE CLASS deque
template<class _Ty,
    class _Ax = allocator<_Ty> >
    class deque
два ведь параметра, а ты пытаешься один подсунуть, а параметры по умолчанию в шаблоных параметрах шаблона не работают
вот у тебя шаблоный параметр с одним аргументом:
Цитата Сообщение от kravam Посмотреть сообщение
template <class> class t_
а в deque то их два! поэтому t_ deque заменить нельзя

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class klass {
 public:
     template <class T>
         klass (T& prom) {;}
};
 
 
         //+++++++++++++++++++++++++++++++++++++++++++++++++//
 
 
int main () {
 
 //Тут всё нормально компилится
 vector <int> vec;
 klass klass_(vec);
 
 stack <int> stac;
 
 //А тут нет
 klass klass__(stac);
 
 return 0;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
17.12.2011, 08:07  [ТС]     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? #10
Ну чё-то начал понимать, то есть получается, если параметр класса вектор или список, то можно изловчиться и написать шаблон класса с пустым конструктором, а вот если вектор или стек (или одинарная очередь), то шансов вообще нет?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
17.12.2011, 10:43     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? #11
Цитата Сообщение от kravam Посмотреть сообщение
а вот если вектор или стек (или одинарная очередь), то шансов вообще нет?
Это почему же? О_о
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,270
17.12.2011, 11:28  [ТС]     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? #12
Все мои доказательства. Как говорится, чем богаты тем и рады.
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
51
52
#include <windows.h>
#include <vector>
#include <stack>
#include <deque>
#include <list>
#include <queue>
using namespace std;
 
 
 
//главное смотреть тут
//Это шаблон класса, параметр которого может быть вектор, список
//или двустороняя очередь
template <class T, template <class, class > class t, template <class> class t_ >
class klass_ {
 public:
  klass_ (t<T, t_<T> >& prom) {;}
};
 
//А это шаблон класса, параметром которого может быть очередь или стек 
template <class T, template <class, class > class t, template <class, class> class t_ >
class _klass {
 public:
  _klass (t<T, t_<T,allocator<T> > > & prom) {;}
};
 
//Шаблоны не взаимозаменяемы. Потому, что догадайтесь сами почему
 
         //+++++++++++++++++++++++++++++++++++++++++++++++++//
 
 
int main () {
 SetConsoleCP (1251);
 SetConsoleOutputCP (1251);
 
 //Тут вектор, список и двусторонняя очередь
 vector <int> vec_;
 klass_  <int, vector, allocator> klass_v_  (vec_);
 list   <int> list_;
 klass_  <int, list, allocator  > klass_l_ (list_);
 deque  <int> deque_;
 klass_  <int, deque, allocator > klass_d_(deque_);
 
 
 //тут очередь и стек
 stack  <int> _stack;
 _klass <int, stack, deque> _klass_d (_stack);
 queue  <int> _queue;
 _klass <int, queue, deque> _klass_q (_queue);
 
 return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2011, 15:10     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона?
Еще ссылки по теме:

C++ Найти ошибки в шаблонном классе
C++ Статическая функция в шаблонном классе
C++ Переменная, содержащая тип, в шаблонном классе

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.12.2011, 15:10     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона? #13
Можно сделать во первых через специализации класса.
Во вторых через шаблоны с переменным числом аргументов.
Yandex
Объявления
17.12.2011, 15:10     Как вы шаблонном классе определить контейнер, тип которого совпадает с именем параметра шаблона?
Ответ Создать тему
Опции темы

Текущее время: 13:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru