Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2011, 19:57   #1
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию Шаблон как параметр шаблона

Хочется делать вроде такого:
Код:
template <class container, class character>
class MyClass{
...
container<character> object;
...
};
А затем вызывать так:
Код:
MyClass<list, int>
Но это невозможно в силу того, что container должен быть шаблоном, а передается как обычный класс. Как решать?
Ищете информацию по C++?
cplusplus.com

Последний раз редактировалось Сtrl; 02.06.2011 в 20:08.
Сtrl вне форума Ответить с цитированием
Старый 02.06.2011, 20:14   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Ответ заключен в названии вашей темы.
Шаблонные параметры шаблонов: http://easy-coding.blogspot.com/2009...g-post_13.html
В вашем случае так:
Код:
template <template <typename> Cont, typename T>
class MyClass
{
... Cont<T> obj;
};
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 02.06.2011, 20:24   #3
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Статья хорошая, спасибо за ссылку. Самое главное - я и сам до этого додумался, погуглив немного, но студия требовала два параметра, что и вгоняло меня в недоумение. Теперь разобрался.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 02.06.2011, 21:29   #4
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Сtrl

MyClass<list, int>

и чем это лучше MyClass<list<int> >
?
Rififi вне форума Ответить с цитированием
Старый 02.06.2011, 21:56   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Syuf
Код:
template <template <typename> class Cont, typename T>
class MyClass
{
... Cont<T> obj;
};
все-таки.

2Rififi
хотя бы тем, что второй аргумент можно сделать по умолчанию. да и нашему шаблону нужно имя типа знать, чтобы инстанцироваться, т.е тебе придется писать
Код:
MyClass<int, vector<int> >
а вообще правильно так:
Код:
template <
    typename T,
    template <typename ELEM, typename ALLOC = std::allocator<ELEM> >
    class Cont = std::vector>
class MyClass {
public:
    Cont<T> obj;
};

MyCLass<int> v1;
MyCLass<int, deque> v2;
MyCLass<int, list> v3;
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 02.06.2011, 22:00   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
2Syuf

Код:
template <template <typename> class Cont, typename T>
class MyClass
{
... Cont<T> obj;
};все-таки.
Бывает... _
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 02.06.2011, 22:05   #7
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

pproger

хотя бы тем, что второй аргумент можно сделать по умолчанию.

по-умолчанию точно также можно сделать и обычный шаблонный тип

template <typename T, typename Container = std::vector<T> >
struct X {};

в STL именно так и сделано, кстати.

да и нашему шаблону нужно имя типа знать, чтобы инстанцироваться

тип выводится через value_type у всех std-контейнеров.
Rififi вне форума Ответить с цитированием
Старый 02.06.2011, 22:18   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Rififi
Цитата:
по-умолчанию точно также можно сделать и обычный шаблонный тип

template <typename T, typename Container = std::vector<T> >
struct X {};
угу, а если захочешь использовать контейнер не по умолчанию, придется писать так
X<int, list<int> > v; (привет stl-адаптерам, хотя тут понятно, что хотели оставить возможность пользователю определять аллокатор)

Цитата:
тип выводится через value_type и всех std-контейнеров.
да, выводится. но логичнее идти сверху вниз, т.е передать тип своему классу, дальше от него уже инстанцировать другие шаблоны. ну тут мне нечего конкретного сказать
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 02.06.2011 в 22:24.
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
метод как параметр процедуры Roof Общие вопросы Delphi 11 29.10.2010 23:34
C++ - массив как параметр функции kefir Помощь студентам 8 12.04.2010 17:48
как сделать параметр ГОСЕАН БД в Delphi 6 20.04.2009 07:24
Как передать параметр? Иллидан Общие вопросы Delphi 8 12.07.2008 12:57
Динамически массив как параметр ф-ии SNUPY Помощь студентам 2 11.05.2008 01:16