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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отличие явной специализации от специализации и экз 
:(
    Опции темы
kLASTER
Дата 24.5.2013, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



доброго времени суток.
Не могу понять чем отличается "специализация" от "экземпляров" и для чего используют экземпляры.
Читаю Прата С.: в его книге идет описание шаблонов, далее явная специализация, и опять специализация и экземпляры, где не очень объяснено различие.
Заранее спасибо!
П.С. Книга удивительно хороша, и этот момент пока единственный который мне не понятен.
PM MAIL   Вверх
mes
Дата 24.5.2013, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



допустим у нас есть шаблон функции механизма "сборщик фруктов". Это означает, что у нас есть схема по сборке  этого механизма, но самого механизма нет. 
когда мы применяем шаблон, компилятор (неявно) создает экземпляр механизма функции, если такового (для нужного набора типов) еще не  существует.
Т.е. у функции появляется код с адресом, по которому ее можно связат` с другими функциями.

В определенных ситуациях бывает желание не отдавать схему, а предоставить  несколько готовых механизмов, например, по сборке яблок и груш. Тогда нам пригождается явное создание экземпляров, коими и будут пользоваться клиенты, а завод оставляет за собой схему.

Бывают и другие ситуации, когда схема не подходит под все нужные случаи.. Например сборщик боярышника выходит по этой  схеме непригодный или неэфективый. Тогда у нас остается возможность специализировать подкорректировать схему под нужный тип фрукта. Этим получим более универсальную схему, включающую корректировки под особые случаи.. 


Это сообщение отредактировал(а) mes - 24.5.2013, 15:23


--------------------
PM MAIL WWW   Вверх
kLASTER
Дата 24.5.2013, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

когда мы применяем шаблон, компилятор (неявно) создает экземпляр механизма функции

я так понимаю, что при прототипировании шаблона уже создаются функции(или экземпляры)

Цитата

В определенных ситуациях бывает желание не отдавать схему, а предоставить  несколько готовых механизмов, например, по сборке яблок и груш. Тогда нам пригождается явное создание экземпляров

не совсем понял, что имелось ввиду.

Код

template <class T> 
void Swap (T &, Т &) ; // прототип шаблона 

template <> void Swap<int> (job &, job &); // явная специализация для job 

int main(void) 
{ 
template void Swap<char> (char &, char &); // явное создание экземпляра для char 
short a, b; 

Swap(a,b); // неявное создание экземпляра шаблона для short 
job n,  

Swap (n, m) ; // использование явной специализации для job 
char g,  

Swap (g, h) ; // использование явного создания экземпляра шаблона для char 

 - из этого кода не понятно "явное создание экземпляра для char" - это таже самая явная специализация(и почему шаблон находится в int main{...})?
 - "неявное создание экземпляра шаблона"- т.е. использование шаблона по назначению?
 - "явная спец для job" - это понятно.
 - "явное создание экземпляра" - это обычное использование шаблона, какие экземпляры? непонятно.

Это сообщение отредактировал(а) kLASTER - 24.5.2013, 15:58
PM MAIL   Вверх
NoviceF
Дата 24.5.2013, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



раз уж тут такая тема.. 

Как широко известно, для оформления шаблонов в исходном коде, применяются в основном 2 метода:

1) inclusion model, она же модель включения.

2) явное инстанцирование шаблонов
Цитата(mes @  24.5.2013,  16:22 Найти цитируемый пост)
В определенных ситуациях бывает желание не отдавать схему, а предоставить  несколько готовых механизмов, например, по сборке яблок и груш. Тогда нам пригождается явное создание экземпляров, коими и будут пользоваться клиенты, а завод оставляет за собой схему.


В одной авторитетной книжке, 2я модель не рекомендуется для применения в серьёзных проектах (Шаблоны c++).. Но с другой стороны, есть неподтверждённые слухи, что и 1й вариант может вызывать проблемы в случае, если класс описанный при его помощи, будет инстанцирован с одинаковым аргументом в нескольких единицах трансляции (я не проверял, но говорят могут быть проблемы с линковкой), при том, что 2й вариант исключает такие ситуации.

Ну и ещё у меня нет понимания, насколько целесообразно и эффективно использовать inline вместе с шаблонами..

Собственно, я знаю, где наверняка есть ответы на эти вопросы, но пока руки не доходят вникнуть.. так что буду благодарен, если кто-нибудь выскажется на тему.
PM MAIL   Вверх
borisbn
Дата 25.5.2013, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата
template <> void Swap<int> (job &, job &);

Уверен, что это правильно?

Добавлено через 2 минуты и 49 секунд
Кажется создание экземпляра нужно, чтобы передать куда-нибудь адрес функции.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kLASTER
Дата 25.5.2013, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Цитата
template <> void Swap<int> (job &, job &);

Уверен, что это правильно?


конечно должно быть "<job>", видимо опечатка в учебнике, хотя в следующем примере:

Код

// choices.ерр — выбор шаблона 
#include <iostream> 
template<class T> // или template <typename T> 
Т lesser (Т а, Т Ь) // #1 
{ 
return а < b ? а : Ь; 
} 
int lesser (int a, int b) // #2 
{ 
a = a < 0 ? -a : a; 
b = b < 0 ? -b : b; 
return a < b ? a : b; 
} 
 
int main() 
{ 
using namespace std; 
int m = 20; 
int n = -30; 
double x = 15.5; 
double у = 2 5.9; 
cout « lesser (m, n) « endl; // используется #2 
cout « lesser(x, y) « endl; // используется #1 с double 
cout « lesser<>(m, n) « endl; // используется #1 с int 
cout « lesser<int>(x, y) « endl; // используется #1 с int 
return 0; 
}

Здесь lesser<>(m, n) - это неявный эжкземпляр?
lesser<int>(x, y) - явный экземпляр?
PM MAIL   Вверх
mes
Дата 25.5.2013, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



kLASTER,  например в таком случае:
Код

//lib.h
template<typename T>
void f(T const& value);


Код

//main.cpp
//#include ""libl.h"

int main()
{
  f(5);
  f("hallo");
  f(3.5);

}
Код

//lib.cpp
//#include ""libl.h"
#include <iostream>

template<typename T>
void f(T const& value)
{
  std::cout << value << std::endl; 
}

получите :
Цитата

In function `main':
undefined reference to `void f<int>(int const&)'
undefined reference to `void f<char [6]>(char const (&) [6])'
undefined reference to `void f<double>(double const&)'


потому что ни одного экземпляра в маин мы создать не можем, за неимением схемы.. у нас только прототип.. 
явное создание экземпляра для трех приведенных типов спасет проект от провала smile






--------------------
PM MAIL WWW   Вверх
mes
Дата 26.5.2013, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(kLASTER @  25.5.2013,  08:36 Найти цитируемый пост)
 lesser<>(m, n) - это неявный эжкземпляр?
lesser<int>(x, y) - явный экземпляр? 

нет, здесь  перегрузка.. 


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


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

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


 




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


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

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