Я использую библиотеку, которая почти полностью состоит из шаблонных классов и функций в заголовочных файлах , например:
// 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
в конце.
Недостатком, конечно, является то, что я должен сам создавать эти новые файлы fwd-foo.h
и foo.cpp
. И, конечно, это проблема обслуживания: когда выходит новая версия библиотеки, я должен адаптировать их к этой новой версии. Есть ли другие недостатки?
И мой главный вопрос:
Есть ли шанс, что я смогу создать эти новые файлы, особенно fwd-foo.h
, автоматически из исходного foo.h
? Я должен сделать это для многих библиотечных заголовочных файлов (может быть, 20 или около того), и автоматическое решение было бы лучше, особенно в случае выпуска новой версии библиотеки, и я должен сделать это снова с новой версией. Есть ли инструменты для этой задачи?
РЕДАКТИРОВАТЬ:
Дополнительный вопрос: Как в этом случае мне может помочь недавно поддерживаемое ключевое слово extern
?