私はかなり大きな C++ サポート ライブラリを開発しており、ヘッダーのみのアプローチに移行していることに気付きました。C++ では、クラスで定義した場所を実装できるため、これはほとんど機能します。テンプレート化されたメソッドの場合、実装はとにかく同じファイルにある必要があるため、実装を定義とともに保持する方がはるかに簡単であることがわかりました。
ただし、「ソース」を使用しなければならない場合が数回あります。ほんの一例として、循環依存が発生することがあり、実装をクラス定義の外に記述する必要があります。これが私がそれをどのように扱っているかです:
//part of libfoo.h
class Bar
{
void CircularDependency(void);
};
#ifdef LIBFOO_COMPILE_INLINE
void Bar::CircularDependency(void)
{
//...
}
#endif
次に、libfoo を使用するプロジェクトは、main.cpp で次のことを行います。
//main.cpp
#define LIBFOO_COMPILE_INLINE
#include "libfoo.h"
その他の .cpp では:
//other.cpp
#include "libfoo.h"
ポイントは、compile-inline セクションが (main.cpp で) 1 回だけコンパイルされることです。
そして最後に私の質問: このイディオムまたはこのように機能する他のプロジェクトの名前はありますか? テンプレート化とクラスメソッドによって実装と定義がぼやけているのは当然の結果のようです。そして、これが悪い考えである理由や、うまくスケーリングできない可能性がある理由はありますか?
余談ですが、多くのコーダーは、正当な理由で、ヘッダーが実装ではなくインターフェイスに似ていることを好むことを知っていますが、プライベートメンバーをすべて一緒に隠すのが好きなので、IMHOドキュメントジェネレーターはインターフェイスの記述に適しています:-)