次のように、ヘッダー ファイルのテンプレート化されたクラスと関数でほぼ完全に構成されるライブラリを使用しています。
// foo.h
template<class T>
class Foo {
Foo(){}
void computeXYZ() { /* heavy code */ }
};
template<class T>
void processFoo(const Foo<T>& foo) { /* more heavy code */ }
これらのヘッダー ファイルの 1 つをインクルードするたびにコンパイル時間が耐えられないため、これは悪いことです (実際には、各コンパイル ユニットにそれらの多くをインクルードします)。
テンプレート パラメーターとして 1 つまたは 2 つの型しか使用しないため、ライブラリ ヘッダー ファイルごとに、次のような重いコードを含まない宣言のみを含むファイルを作成する予定です。
// NEW: fwd-foo.h
template<class T>
class Foo {
Foo();
void computeXYZ();
};
template<class T>
void processFoo(const Foo<T>& foo);
そして、必要なすべてのインスタンス化を作成する 1 つのファイル。そのファイルは、一度だけ個別にコンパイルできます。
// 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
追加の質問:この場合、新しくサポートされたキーワードはどのように役立ちますか?