C++の学習プロジェクトの一部として、カスタムテンプレートコンテナーを実装しています。コンテナーは、シリアル化、メモリ管理、イテレーターなどのさまざまなコンポーネントを利用します。コードを整理するための最良の方法は何ですか。
私はこれをオンラインのいくつかの例で見ました。しかし、これを行うと、最終的に数千行のファイルができます。
// container.hpp
template <typename params>
class Container {
public:
// params is a struct with typedefs and static variables
// used to configure the container at compile time
// I define additional typedefs and static variables here from params::
public:
class iterator {
// can use the typedefs and variables above
};
class memory {
// can use the typedefs and variables above
};
};
各ファイルには、1つのコンポーネントの実装が含まれています。
// memory.hpp
template <typename Container>
class memory {
public:
// typedefs and static variables from Container::
};
// iterator.hpp
template <typename Container>
class iterator {
public:
// typedefs and static variables from Container::
};
// container.hpp
#include "iterator.hpp"
#include "memory.hpp"
template <typename params>
class Container {
public:
// typedefs and static variables here from params::
typedef Container<params> self_type;
iterator<self_type> begin();
private:
memory<self_type> mem;
};
ソリューション1はよりクリーンに見えます。コンテナータイプをソリューション2のメモリとイテレーターに渡す必要があるという問題がありましたが、同時にコードはソリューション2の異なるファイルに編成されています。各ファイルには、1つのコンポーネントの実装が含まれています。
それは単に個人的な好みの問題ですか?または、あるソリューションを他のソリューションよりも選択する客観的な理由はありますか?または、完全に異なるより良いアプローチはありますか?
それは単に個人の好みの問題ですか、それとも他のソリューションよりも1つのソリューションを選択する理由がありますか? (または完全に異なるアプローチ)。
いいえ、それは個人的な好みの問題ではありません。
複数のコンポーネントを別々のヘッダーファイルに実装することをお勧めします(2番目のソリューションで提案したとおり)。
これは増加します
オプション2の方が優れており、これには客観的な理由があります。そして、はい、アプローチを改善することができます。
オプション1には懸念の分離がありません。これは何を意味するのでしょうか?
オプション2は、ソリューションのコンポーネント間の明確な境界を定義します。これには多くの利点があります:
container.hpp
を読み取らなくても、iterator.hpp
の内容を把握できます。すべてのコンポーネントを独自の名前空間に含める必要があります。これは重要です。オプション1ではiterator
は独自の名前ではなくContainer::iterator
として公開されますが、オプション2では名前空間なしではiterator
と呼ばれるため、いくつかのあいまいさ。
別の可能な改善点は、各テンプレートクラスの定義を2つのファイルの実装から分離することです。
最後に、boost
headersのガイドラインでさらにインスピレーションを得られるかもしれません。