Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Спецификация шаблона, шаблонного метода шаблонного класса 
:(
    Опции темы
Jcs
Дата 2.7.2004, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



Хочется специализировать функцию process для указателя SOURCE_TYPE*, т.е. по сути нужна частичная специализация
Код

template<typename SOURCE_TYPE> struct converter
{
template<typename DEST_TYPE> DEST_TYPE process(SOURCE_TYPE item);

};


template<typename SOURCE_TYPE> template<typename DEST_TYPE> DEST_TYPE converter<SOURCE_TYPE>::process(SOURCE_TYPE item)
{return DEST_TYPE(item);}

//template<>
template<typename SOURCE_TYPE> SOURCE_TYPE* converter<SOURCE_TYPE>::process<SOURCE_TYPE*>(SOURCE_TYPE item)
{return &item;}
Добавлено @ 19:41
прошу прощения
Код

template<typename SOURCE_TYPE> struct converter
{
template<typename DEST_TYPE> DEST_TYPE process(SOURCE_TYPE item);
};

template<typename SOURCE_TYPE> template<typename DEST_TYPE> DEST_TYPE converter<SOURCE_TYPE>::process(SOURCE_TYPE item)
{return DEST_TYPE(item);}

//template<>
template<typename SOURCE_TYPE> SOURCE_TYPE* converter<SOURCE_TYPE>::process<SOURCE_TYPE*>(SOURCE_TYPE item)
{return &item;}

PM   Вверх
Олег М
Дата 5.7.2004, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Что-то страшное замутил. А что хотел сделать-то вообще?
Цитата
//template<>
template<typename SOURCE_TYPE> SOURCE_TYPE* converter<SOURCE_TYPE>::process<SOURCE_TYPE*>(SOURCE_TYPE item)
{return &item;}

У тебя SORCE_TYPE-то где-то объявлен? Что ты хотел специализировать?

PM MAIL ICQ   Вверх
Jcs
Дата 6.7.2004, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



Хотелось бы сделать конвертер, который либо вызывал бы оператор преобразования типа, если таковой имеется, либо возвращал итем, либо его адрес. Вся эта хрень для того чтобы для функция, принимающая шаблонный контейнер, сама определяла, чего туда валить. Например - есть функция как-то получающая итемы (точки или еще чего-нить), если подсовываем ей контейнер адресов, то она валит туда указатели на итемы, если контейнер итемов - то, соответственно, сами итемы.
PM   Вверх
Олег М
Дата 6.7.2004, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



То есть, насколько я понял тебе нужны два контейнера, которые хранят либо объекты, либо указатели на объекты. А в качестве параметра в функцию добавления передаются объекты или ссылки на них. Ну так наверное проще будет переписать для специализации котнйнера функцию добавления, а не выдумывать.
Тем более у меня специализация на указатели в вижуал студии нифига не заработала. Такое ощущение что она там ваще не поддерживается
PM MAIL ICQ   Вверх
bel_nikita
Дата 6.7.2004, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
Тем более у меня специализация на указатели в вижуал студии нифига не заработала. Такое ощущение что она там ваще не поддерживается
Частичная специализация в MSVS не поддерживается! Только начиная с MSVS 7.


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Jcs
Дата 7.7.2004, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



Цитата
переписать для специализации котнйнера функцию добавления

Это как? Функция добавления-то одна. В контейнер адресов она валит указатели, в контейнер итемов - итемы соответственно. И на вход ей подается уже ссылка на элемент контейнера.
А частичная специализация возможна тока в 7.1 . К примеру класс iteratоr_traits частично специализирован для указателей. Возможна проблема в том, что таким образом частично специализировать можно тока класс, а не его метод.
PM   Вверх
bel_nikita
Дата 7.7.2004, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
Функция добавления-то одна. В контейнер адресов она валит указатели, в контейнер итемов - итемы соответственно. И на вход ей подается уже ссылка на элемент контейнера.

Что-то я не понял. Если функция одна, и на ее вход подается либо указатель, либо ссылка, то какая проблема? Тогда и шаблоны не нужны smile.gif


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Олег М
Дата 7.7.2004, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата
Это как? Функция добавления-то одна. В контейнер адресов она валит указатели, в контейнер итемов - итемы соответственно. И на вход ей подается уже ссылка на элемент контейнера.

Что значит как? Спецификации-то разные. Значит разные классы. Переписывай специфичные методы и всё.

Цитата
А частичная специализация возможна тока в 7.1 . К примеру класс iteratоr_traits частично специализирован для указателей. Возможна проблема в том, что таким образом частично специализировать можно тока класс, а не его метод.

Не скажу точно что было - на так как написано в Страуструпе - в вижуал студии нифига не работает.


Цитата
Что-то я не понял. Если функция одна, и на ее вход подается либо указатель, либо ссылка, то какая проблема? Тогда и шаблоны не нужны

Наоборот на вход подаётся только ссылка, а внутри берётся либо ссылка либо указатель

PM MAIL ICQ   Вверх
Jcs
Дата 7.7.2004, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



У нас есть шаблонный класс, например, списка. У него есть метод push_back, который принимает ссылку на итем
Код

template<typename ITEM> class list
{
     ...
  bool push_back(const ITEM& item)
  {...}
};

Класс у нас не знает ничего о том, какого типа у него ITEM, указатель это или нет. У нас есть что-то, что хочет попасть в контейнер. Необходимо определить какого типа это что-то, привести его к тому что лежит в контейнере (взять адрес, если необходимо) и вызвать метод push_back. Если создать шаблонную функцию push_back
Код

template<typename ITEM> template<typename PUSHING> push_back(PUSHING& pushing)
{...}
, то как она будет работать в случае, если у нас контейнер указателей, и мы подсовываем ей итем. Если можно сказать функции, что она принимает тип, указатель на который является типом элементов контейнера, методом которого она является (во хрень какая!..), то как это сделать, я не знаю. Извиняюсь что так запутанно написал, но по другому не получилось.
PM   Вверх
bel_nikita
Дата 7.7.2004, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата
У нас есть что-то, что хочет попасть в контейнер. Необходимо определить какого типа это что-то, привести его к тому что лежит в контейнере (взять адрес, если необходимо) и вызвать метод push_back.
Запихнуть то можно. А достовать как? Надо же опять к типу приводить.

Что-то я не пойму. Так контейнер, что должен хранить: указатель или целиком объект? Что должно быть на входе функции? Перегрузи функцию для поинтера и итема.

Может все намного проще:
Цитата
typedef int*  PINT;

void Temp(const PINT& Data)
{
}

int main(int argc, char* argv[])
{
  int  Data;
  int*  pData;
  Temp(pData);
  Temp(&Data); // На грани фола конечно же, но все же smile.gif
}




--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Jcs
Дата 8.7.2004, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



Есть функция, на вход которой шаблонным параметром приходит контейнер и ссылка на итем для занесения туда. Если это контейнер указателей, то кладем туда адрес ссылки, если контейнер итемов - то саму ссылку.
Код

template<class CONT, typename ITEM>pusher(CONTAINER& cont, ITEM& item)
{
// если контейнер итемов
  cont.push_back(item);
// если контейнер указателей
  cont.push_back(&item);
}

PM   Вверх
bel_nikita
Дата 9.7.2004, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Я так понял, проблема вот в этом:
Цитата

// если контейнер итемов
  cont.push_back(item);
// если контейнер указателей
  cont.push_back(&item);

Если VC6, то не выйдет. Только, если пойти по другому пути smile.gif Разновидностей контейнеров много?

Это сообщение отредактировал(а) bel_nikita - 9.7.2004, 00:15


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Jcs
Дата 9.7.2004, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



Да и в семь один тоже не особо получается(( Пришлось написать два адаптера push_item и push_ptr и их пихать в функцию.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4510 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.