Читаем C++ для начинающих полностью

double da[6] = { 10.2, 7.1, 14.5, 3.2, 25.0, 16.8 };

#include iostream

int main()

{

// конкретизация min() для массива из 5 элементов типа int

// подставляется Type = int, size = 5

int i = min( ia );

if ( i != 3 )

cout "??oops: integer min() failed\n";

else cout "!!ok: integer min() worked\n";

// конкретизация min() для массива из 6 элементов типа double

// подставляется Type = double, size = 6

double d = min( da );

if ( d != 3.2 )

cout "??oops: double min() failed\n";

else cout "!!ok: double min() worked\n";

return 0;

}

Вызов

int i = min( ia );

приводит к конкретизации следующего экземпляра функции min(), в котором Type заменено на int, а size на 5:

int min( int (r_array)[5] )

{

int min_val = r_array[0];

for ( int i = 1; i 5; ++i )

if ( r_array[i] min_val )

min_val = r_array[i];

return min_val;

}

Аналогично вызов

double d = min( da );

конкретизирует экземпляр min(), в котором Type заменено на double, а size на 6:

В качестве формальных параметров шаблона функции используются параметр-тип и параметр-константа. Для определения фактического типа и значения константы, которые надо подставить в шаблон, исследуются фактические аргументы, переданные при вызове функции. В нашем примере для идентификации аргументов шаблона при конкретизации используются тип ia (массив из пяти int) и da (массив из шести double). Процесс определения типов и значений аргументов шаблона по известным фактическим аргументам функции называется выведением (deduction) аргументов шаблона. (В следующем разделе мы расскажем об этом подробнее. А в разделе 10.4 речь пойдет о возможности явного задания аргументов.)

Шаблон конкретизируется либо при вызове, либо при взятии адреса функции. В следующем примере указатель pf инициализируется адресом конкретизированного экземпляра шаблона. Его аргументы определяются путем исследования типа параметра функции, на которую указывает pf:

template typename Type, int size

Type min( Type (p_array)[size] ) { /* ... */ }

// pf указывает на int min( int ()[10] )

int (*pf)(int ()[10]) = min;

Тип pf – это указатель на функцию с параметром типа int()[10], который определяет тип аргумента шаблона Type и значение аргумента шаблона size при конкретизации min(). Аргумент шаблона Type будет иметь тип int, а значением аргумента шаблона size будет 10. Конкретизированная функция представляется как min(int()[10]), и указатель pf адресует именно ее.

Когда берется адрес шаблона функции, контекст должен быть таким, чтобы можно было однозначно определить типы и значения аргументов шаблона. Если сделать это не удается, компилятор выдает сообщение об ошибке:

template typename Type, int size

Type min( Type (r_array)[size] ) { /* ... */ }

typedef int (rai)[10];

typedef double (rad)[20];

void func( int (*)(rai) );

void func( double (*)(rad) );

int main() {

// ошибка: как конкретизировать min()?

func( min );

}

Функция func() перегружена и тип ее параметра не позволяет однозначно определить ни аргумент шаблона Type, ни значение аргумента шаблона size. Результатом конкретизации вызова func() может быть любая из следующих функций:

min( int (*)(int()[10]) )

min( double (*)(double()[20]) )

Поскольку однозначно определить аргументы функции func() нельзя, взятие адреса конкретизированного шаблона в таком контексте приводит к ошибке компиляции.

Этого можно избежать, если использовать явное приведение типов для указания типа аргумента:

int main() {

// правильно: с помощью явного приведения указывается тип аргумента

func( static_cast double(*)(rad) (min) );

}

Лучше, однако, применять явное задание аргументов шаблона, как будет показано в разделе 10.4.

<p>10.3. Вывод аргументов шаблона А</p>
Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных