• Файл plus()
.
• Файл plus()
.
• Файл plus()
и определяет функцию main()
, использующую plus()
.
#ifndef PLUS_HPP_INCLUDED
#define PLUS_HPP_INCLUDED
export template
T plus(const T& lhs, const T& rhs);
#endif // #ifndef PLUS_HPP_INCLUDED
#include "plus.hpp"
template
T plus(const T& lhs, const T& rhs) {
return rhs + lhs;
}
#include
#include "plus.hpp"
int main() {
std::cout << "2 + 2 = " << plus(2, 2) << "\n";
}
Чтобы скомпилировать
$ como -c --export plus.cpp
Эта команда также генерирует файл
Затем скомпилируйте
$ como -c --export test.cpp
Наконец, скомпонуйте исполняемый файл
$ como --export -о test test.obj
Две последние команды также можно объединить в одну.
$ como --export -o test test.cpp
Теперь можно запустить
$ ./test
2 + 2 = 4
Теперь предположите, что файлы
$ como --export --template_directory=../plus -I../plus -o test
test.cpp
C++ поддерживает две модели обеспечения определений шаблонов функций и статических данных-членов шаблонов классов:
Раздельная модель ближе к традиционной манере организации исходного кода C++. Для шаблонов, объявленных с ключевым словом export
, не требуется включать определения во все исходные файлы, их использующие. Вместо этого определения помещаются в отдельные файлы
Раздельная модель предлагает несколько потенциальных преимуществ.
Время компиляции при использовании раздельной модели может сократиться благодаря тому, что сканирование определений шаблонов производится реже, и потому, что раздельная модель уменьшает зависимости между модулями.
Имена функций, классов и данных, используемых в файле реализации шаблона, могут быть полностью скрыты от кода, использующего этот шаблон, что снижает возможность случайного совпадения имен. Кроме того, автор реализации шаблона может уделять меньше внимания случайным совпадениям с именами из исходных файлов, использующих шаблон
Теоретически при использовании раздельной модели поставщик может распространять реализации шаблонов в скомпилированном двоичном виде, находящемся где-то посередине между исходным кодом C++ и обычными объектными файлами.