標準ライブラリ コンテナ用の単純なプリティ プリント機能を作成する任務を負っている状況を考えてみましょう。ヘッダーpretty_print.hpp
では、次の関数を宣言します。
// In pretty_print.hpp
template<typename T>
void pretty_print(std::ostream& os, std::vector<T> const& vec);
template<typename T>
void pretty_print(std::ostream& os, std::set<T> const& set);
template<typename T, typename U>
void pretty_print(std::ostream& os, std::map<T, U> const& map);
// etc.
ただし、コンテナーは前方宣言できないため、#include
各コンテナー ヘッダーを宣言する必要があります。その結果、pretty_print.hpp
ライブラリの他の部分にインクルードすると、非常に多くのコードが肥大化する (可能性がある?) ことになります。したがって、これらの依存関係が他のコンパイル ユニットに持ち込まれないようにするためにprint_vector.hpp
、print_set.hpp
.同様のレイアウト:
// In print_vector.hpp
#include <vector>
template<typename T>
void pretty_print(std::ostream& os, std::vector<T> const& vec);
// In print_set.hpp
#include <set>
template<typename T>
void pretty_print(std::ostream& os, std::set<T> const& set);
// you get the point
pretty_print
したがって、ベクターを使用できるようにしたい場合は、現在のコンパイル単位に#include print_vector.hpp
のみ導入し、 、または必要のないその他のヘッダーには導入しません。例として使用していることに注意してください(コンテナーをきれいに印刷するためのはるかに優れた方法があると確信しています) が、これを行う理由は他にもあります (たとえば、を含める前にヘッダー 'ラッパー' を作成するなど)。<vector>
<set>
<map>
pretty_print
lean_windows.h
#define WIN32_LEAN_AND_MEAN
windows.h
コンパイル単位で使用しない/必要としない可能性のある一連のヘッダーを導入する可能性のある肥大化を回避していることを意味するため、このアプローチに問題はありません。それにもかかわらず、「インクルードラッパー」が実際に意図したヘッダーをインクルードし、標準ライブラリヘッダーをインクルードする「神聖さ」を損なうように思われるという意味で、他の人には明らかではないという意味で「間違っている」と感じています (#include <string>
は慣用的ですが、#include "string_wrapper.hpp"
ではありません)。
これは悪い習慣と見なされますか\悪い設計を示していますか?