Я использую библиотеку, которая состоит почти полностью из шаблонных классов и функций в заголовочных файлах, как это:Автоматически отделять определения классов от объявлений?
// foo.h
template<class T>
class Foo {
Foo(){}
void computeXYZ() { /* heavy code */ }
};
template<class T>
void processFoo(const Foo<T>& foo) { /* more heavy code */ }
Теперь это плохо, потому что компилировать раз невыносим всякий раз, когда я включаю один из тех заголовка файлов (и на самом деле я включаю многие из них в каждую из моих компиляционных единиц).
Поскольку в качестве параметра шаблона я использую только один или два типа в любом случае я планирую создать для каждого файла библиотеки заголовка, файл, который содержит только объявления, без тяжелого кода, как это:
// NEW: fwd-foo.h
template<class T>
class Foo {
Foo();
void computeXYZ();
};
template<class T>
void processFoo(const Foo<T>& foo);
И затем один файл, который создает все необходимые экземпляры, которые мне понадобятся. Этот файл может быть компилируется отдельно, раз и навсегда:
// NEW: foo.cpp
#include "foo.h"
template class Foo<int>;
template class Foo<double>;
template void processFoo(const Foo<int>& foo);
template void processFoo(const Foo<double>& foo);
Теперь я могу просто включить fwd-foo.h
в моем коде и короткое время компиляции. Я свяжусь с foo.o
в конце.
Недостатком, конечно же, является то, что я должен сам создать эти новые файлы и foo.cpp
. И, конечно же, это проблема обслуживания. Когда выпущена новая версия библиотеки, я должен адаптировать ее к этой новой версии. Есть ли другие недостатки?
И мой главный вопрос:
Есть ли шанс, что я могу создать эти новые файлы, особенно fwd-foo.h
, автоматически от оригинального foo.h
? Я должен сделать это для многих файлов заголовков библиотеки (может быть, около 20), и автоматическое решение было бы лучше всего в случае выпуска новой версии библиотеки, и я должен сделать это снова с новой версией. Доступны ли какие-либо инструменты для этой задачи?
EDIT:
Дополнительный вопрос: Как вновь поддерживается extern
ключевое слово мне помочь в этом случае?
Кажется, это то, что я искал. Хотя, я немного устал, чтобы на самом деле использовать его ... – Frank