私が理解しているように、あなたはビルド時間とライブラリの保守性に最も関心がありますか?
まず、一度にすべてを「修正」しようとしないでください。
次に、何を修正するかを理解します。テンプレートの複雑さは、多くの場合、特定の使用を強制したり、間違いを犯さないようにコンパイラーを支援したりするなどの理由で存在します。その理由は時々遠ざかるかもしれませんが、「誰も自分が何をしているのか本当に分かっていない」という理由で 100 行を捨てることは軽視すべきではありません。ここで提案することはすべて、本当に厄介なバグを引き起こす可能性があることを警告しました.
第 3 に、最初に安価な修正を検討します。たとえば、マシンの高速化やビルド ツールの分散などです。少なくとも、ボードが使用するすべての RAM を投入し、古いディスクを捨てます。それは違います。OS用に1ドライブ、ビルド用に1ドライブという安価なマンズRAIDです。
ライブラリは十分に文書化されていますか? これは、ドキュメントを作成するための最高のチャンスです。そのようなドキュメントを作成するのに役立つ doxygen などのツールを調べてください。
すべて考慮?OK、ビルド時間に関するいくつかの提案;)
C++ビルド モデルを理解する: すべての .cpp は個別にコンパイルされます。つまり、多くのヘッダーを持つ多くの .cpp ファイル = 巨大なビルドです。ただし、これはすべてを 1 つの .cpp ファイルに入れるようにというアドバイスではありません。ただし、ビルドを大幅に高速化できる 1 つのトリック (!) は、多数の .cpp ファイルを含む単一の .cpp ファイルを作成し、その「マスター」ファイルのみをコンパイラに供給することです。ただし、やみくもにこれを行うことはできません。これにより発生する可能性のあるエラーの種類を理解する必要があります。
まだ持っていない場合は、リモート接続できる別のビルド マシンを入手してください。一部のインクルードが壊れていないかどうかを確認するには、ほぼ完全なビルドを多数実行する必要があります。これを別のマシンで実行することをお勧めします。これにより、他の作業を妨げることはありません。とにかく、長期的には、毎日の統合ビルドに必要になります;)
プリコンパイル済みヘッダーを使用します。(高速なマシンでより適切にスケーリングします。上記を参照してください)
ヘッダーの包含ポリシーを確認してください。すべてのファイルは「独立」している必要がありますが (つまり、他の誰かが含める必要のあるすべてのファイルを含める必要があります)、むやみに含めないでください。残念ながら、不要な #incldue ステートメントを見つけるツールはまだ見つかっていませんが、「ホットスポット」ファイルで使用されていないヘッダーを削除するのに時間がかかる場合があります。
使用するテンプレートの前方宣言を作成して使用します。多くの場合、多くの場所で forwad 宣言を含むヘッダーをインクルードし、いくつかの特定の場所でのみ完全なヘッダーを使用できます。これにより、コンパイル時間が大幅に短縮されます。<iosfwd>
標準ライブラリが I/O ストリームに対してそれを行う方法をヘッダーで確認してください。
少数の型のテンプレートのオーバーロード: 次のような非常に少数の型にのみ役立つ複雑な関数テンプレートがある場合:
// .h
template <typename FLOAT> // float or double only
FLOAT CalcIt(int len, FLOAT * values) { ... }
ヘッダーでオーバーロードを宣言し、テンプレートを本文に移動できます。
// .h
float CalcIt(int len, float * values);
double CalcIt(int len, double * values);
// .cpp
template <typename FLOAT> // float or double only
FLOAT CalcItT(int len, FLOAT * values) { ... }
float CalcIt(int len, float * values) { return CalcItT(len, values); }
double CalcIt(int len, double * values) { return CalcItT(len, values); }
これにより、長いテンプレートが単一のコンパイル単位に移動します。
残念ながら、これはクラスでの使用が制限されています。
PIMPL イディオムがコードをヘッダーから .cpp ファイルに移動できるかどうかを確認します。
その背後に隠れている一般的なルールは、ライブラリのインターフェイスを実装から分離することです。コメント、detail
名前空間、および個別の.impl.h
ヘッダーを使用して、外部に知られるべきことを、それがどのように達成されるかから精神的および物理的に分離します。これにより、ライブラリの真の価値が明らかになり (複雑さを実際にカプセル化していますか?)、最初に「簡単なターゲット」を置き換える機会が得られます。
より具体的なアドバイス、および与えられたアドバイスがどれほど役立つかは、実際のライブラリに大きく依存します。
幸運を!