1.26. Использование экспортируемых шаблонов
1.26. Использование экспортируемых шаблонов
Проблема
Вы хотите собрать программу, использующую экспортируемые шаблоны, что означает, что она объявляет шаблоны в заголовочных файлах с использованием ключевого слова export, а реализация шаблонов находится в файлах .cpp.
Решение
Во-первых, скомпилируйте в объектные файлы файлы .cpp, содержащие реализации шаблонов, передав компилятору опцию командной строки, необходимую для включения экспортируемых шаблонов. Затем скомпилируйте и скомпонуйте файлы .cpp, использующие экспортируемые шаблоны, передав компилятору и компоновщику опции командной строки, необходимые для включения экспортируемых шаблонов, а также опции, указывающие директории, содержащие реализации шаблонов.
Опции для включения экспортируемых шаблонов приведены в табл 1.39. Опции для указания расположения реализаций шаблонов приведены в табл. 1.40. Если ваш инструментарий в этой таблице не указан, то он, скорее всего, не поддерживает экспортируемых шаблонов.
Табл. 1.39. Опции для включения экспортируемых шаблонов
? Версии компилятора Intel для Linux до 9.0 использовали опцию -strict_ansi
Табл. 1.40. Опции, указывающие расположение реализаций шаблонов
Инструментарий Сценарий Comeau -template_directory=<path> Intel (Linux) -export_dir<path>Например, предположим, что вы хотите скомпилировать программу, показанную в примере 1.27. Она содержит три файла.
• Файл plus.hpp содержит объявление экспортируемого шаблона функции plus().
• Файл plus.cpp содержит определение plus().
• Файл test.cpp включает объявление — но не определение — plus() и определяет функцию main(), использующую plus().
Пример 1.27. Простая программа, использующая экспортируемые шаблоны
plus.hpp:
#ifndef PLUS_HPP_INCLUDED
#define PLUS_HPP_INCLUDED
export template<typename T>
T plus(const T& lhs, const T& rhs);
#endif // #ifndef PLUS_HPP_INCLUDED
plus.cpp:
#include "plus.hpp"
template<typename T>
T plus(const T& lhs, const T& rhs) {
return rhs + lhs;
}
test.cpp:
#include <iostream>
#include "plus.hpp"
int main() {
std::cout << "2 + 2 = " << plus(2, 2) << " ";
}
Чтобы скомпилировать plus.cpp в объектный файл plus.obj с помощью Comeau в Unix, перейдите в директорию, содержащую plus.cpp, plus.hpp и test.cpp, и введите следующую команду.
$ como -c --export plus.cpp
Эта команда также генерирует файл plus.et, описывающий реализацию шаблона, содержащегося в plus.cpp.
Для развлечения откройте plus.et в текстовом редакторе.
Затем скомпилируйте test.cpp в объектный файл test.obj с помощью команды:
$ como -c --export test.cpp
Наконец, скомпонуйте исполняемый файл test.exe.
$ como --export -о test test.obj
Две последние команды также можно объединить в одну.
$ como --export -o test test.cpp
Теперь можно запустить test.exe.
$ ./test
2 + 2 = 4
Теперь предположите, что файлы plus.hpp и plus.cpp находятся в директории с именем plus, a test.cpp находится в дочерней директории test. Чтобы скомпилировать и скомпоновать test.cpp, перейдите в директорию test и введите:
$ como --export --template_directory=../plus -I../plus -o test
test.cpp
Обсуждение
C++ поддерживает две модели обеспечения определений шаблонов функций и статических данных-членов шаблонов классов: включающую (inclusion model) и раздельную (separation model) модели. Включающая модель знакома всем программистам, регулярно использующим шаблоны С++, но часто оказывается непонятной программистам, привыкшим писать код без шаблонов. Во включающей модели определение шаблона функции — или статических данных-членов шаблона класса — должно включаться в каждый исходный файл, ее использующий. В противоположность этому при использовании нешаблонных функций и данных достаточно включить в исходный файл только объявление; определение может быть помещено в отдельный файл .cpp.
Раздельная модель ближе к традиционной манере организации исходного кода C++. Для шаблонов, объявленных с ключевым словом export, не требуется включать определения во все исходные файлы, их использующие. Вместо этого определения помещаются в отдельные файлы .cpp. Однако параллель с традиционной организацией кода не полная, так как даже несмотря на то, что код, использующий экспортируемый шаблон, не требует включения его определения, он зависит от определения.
Раздельная модель предлагает несколько потенциальных преимуществ.
Уменьшение времени компиляции
Время компиляции при использовании раздельной модели может сократиться благодаря тому, что сканирование определений шаблонов производится реже, и потому, что раздельная модель уменьшает зависимости между модулями.
Снижение «загрязнения» символов
Имена функций, классов и данных, используемых в файле реализации шаблона, могут быть полностью скрыты от кода, использующего этот шаблон, что снижает возможность случайного совпадения имен. Кроме того, автор реализации шаблона может уделять меньше внимания случайным совпадениям с именами из исходных файлов, использующих шаблон
Возможность поставлять скомпилированные реализации шаблонов.
Теоретически при использовании раздельной модели поставщик может распространять реализации шаблонов в скомпилированном двоичном виде, находящемся где-то посередине между исходным кодом C++ и обычными объектными файлами.
Все три потенциальных преимущества раздельной модели спорны. Во-первых, хотя некоторые пользователи сообщали о сокращении времени компиляции, раздельная модель также может в некоторых случаях привести к его увеличению. В настоящее время данных для окончательных выводов недостаточно. Во-вторых, хотя раздельная модель снижает некоторые виды загрязнения символов, правила языка, необходимые для поддержки раздельной модели, и особенно идея двухэтапного поиска, усложняют способ написания кода шаблона — даже по сравнению с включающей моделью - и имеют несколько нежелательных последствий. В-третьих, все существующие реализации раздельной модели основаны на оболочке EDG, a EDG пока еще не предоставляет никаких возможностей для компиляции исходных файлов, содержащих реализации экспортируемых шаблонов, в двоичные файлы, которые могут поставляться вместо исходников.
В 2003 году имела место попытка удалить экспортируемые шаблоны из будущих версий стандарта С++, но она провалилась. Следовательно, экспортируемые шаблоны являются постоянной частью языка С++, и вы должны научиться использовать их.
Смотри также
Рецепт 1.25.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Тела шаблонов
Тела шаблонов Шаблоны формируются по жестко заданным правилам. Они способны содержать элементы <xsl:param>, за которыми следует тело шаблона; в последнем могут содержаться данные PCDATA, инструкции XSLT, элементы расширения и элементы буквального
Создание шаблонов
Создание шаблонов При работе с корреспонденцией может возникнуть ситуация, когда в своих сообщениях вам придется неоднократно набирать повторяющийся текстовый фрагмент (простейший пример – приветствие и подпись). Согласитесь, в этом случае имеет смысл зафиксировать
Определение экспортируемых каталогов
Определение экспортируемых каталогов Для управления сервером NFS используется файл /etc/exports. В этом файле содержится набор записей, каждая из которых определяет экспортируемый каталог. Запись занимает одну строку и имеет следующий формат:экспортируемый_каталог
Монтирование экспортируемых каталогов
Монтирование экспортируемых каталогов На стороне клиента экспортируемые каталоги выглядят как разделы диска. Для их монтирования используется команда mount, но при ее вызове указываются сервер NFS и монтируемый каталог. Эти данные задаются в формате
Содержимое шаблонов безопасности
Содержимое шаблонов безопасности Все шаблоны безопасности содержат следующие разделы: Политики учетных записей, Локальные политики, Журнал событий, Группы с ограниченным доступом, Системные службы, Реестр и Файловая система. Вкратце рассмотрим каждый из этих
2.11. Использование шаблонов Word
2.11. Использование шаблонов Word Еще один инструмент упрощения ввода текста – шаблон – документ, который создают один раз, чтобы потом использовать его для создания других документов. Шаблоны представляют собой электронные бланки, в которых можно задать все необходимые
Использование шаблонов титров
Использование шаблонов титров Титры могут использоваться не только для показа на экране названия фильма и списка актеров. В немом кино с помощью титров выводились диалоги, в современных фильмах – место или время события в кадре, в информационных передачах – номера
Создание шаблонов
Создание шаблонов Если вам приходится много переписываться, очень скоро вы обнаружите, что вам надоело каждый раз писать «Доброе время суток!» в начале письма и «С искренними надеждами на плодотворное сотрудничество, Вассисуалий Апполинарович Иммануилов-Полесский» в
Создание пользовательских шаблонов
Создание пользовательских шаблонов Благодаря шаблонам можно сэкономить много времени. Например, если вы постоянно работаете с какой-нибудь организацией и каждый раз вводите стандартное приветствие, реквизиты и т. д., удобно будет создать собственный шаблон на основе
10.5. Модели компиляции шаблонов А
10.5. Модели компиляции шаблонов А Шаблон функции задает алгоритм для построения определений множества экземпляров функций. Сам шаблон не определяет никакой функции. Например, когда компилятор видит шаблон:template typename TypeType min( Type t1, Type t2 ){return t1 t2 ? t1 : t2;}он сохраняет
10.7. Перегрузка шаблонов функций А
10.7. Перегрузка шаблонов функций А Шаблон функции может быть перегружен. В следующем примере есть три перегруженных объявления для шаблона min():// определение шаблона класса Array// (см. раздел 2.4)template typename Typeclass Array( /* ... */ };// три объявления шаблона функции min()template typename TypeType min(
Использование шаблонов Word
Использование шаблонов Word Еще один инструмент упрощения ввода текста – шаблоны. Шаблон – это документ, который создают один раз и потом используют для создания других документов. Шаблоны представляют собой электронные бланки, в которых можно настроить все необходимые
Практическая работа 36. Использование шаблонов и тем
Практическая работа 36. Использование шаблонов и тем Задание. Создать резюме с помощью встроенного шаблона, заполнить его собственными или вымышленными данными (рис. 5.54), изменить форматирование документа с помощью тем. Рис. 5.54. Пример резюме с вымышленными