Java では、名前空間を使用するのは非常に簡単です。Ident
ソース ファイルで使用する修飾識別子ごとimport ns1.ns2.ns2.ns3.ns4.Ident;
に、ファイルの先頭に を置きます。次に、ソース コードのあらゆる場所で (短い) 非修飾名を使用できます。このimport
ステートメントは、それが書き留められているファイルにのみ適用されるため、問題が発生することはありません。
ただし、C++ で名前空間修飾子を削除する最善の方法はよくわかりません。
最も明白な解決策は、おそらくusing
andusing namespace
ステートメントです。ただし、少なくともヘッダー ファイルの場合は、using ステートメントが記述される単一のファイルに限定されないため、これはかなり悪い解決策のようです。たとえばusing
、実装が直接内部にあるヘッダー ファイルのみで構成されるスリムなライブラリの場合、または一般的なヘッダー ファイルの場合は除外されます。
これまでに使用した別のオプションは、クラスで使用する修飾名ごとに、クラスtypedef
のプライベート セクションに対応するものを追加することです。したがって、このアプローチを Java と比較する場合、基本的に import ステートメント リスト全体を取得し、import
withtypedef
を置き換えてクラス宣言に配置します。
ただし、メソッド宣言の型は対応するクラスのプライベート型であるため、厳密に言えば、クラスのユーザーは戻り値とパラメーター値の型を知らないため、このアプローチはあまり好きではありません。
OK、これですべてtypedef
を公開できます。しかし、それぞれの型を何度も再定義するので、これはおそらくあまり良い考えではありません。構造体ns1::ns2::ns3::MyStructure
と 2 つのクラスMyClassA
とMyClassB
. 両方のクラスには、実際には のインスタンスをパラメータとして取るメソッドがありますns1::ns2::ns3::MyStructure
。しかし、すべてのクラスは、長い修飾名を取り除くために使用する型を再定義するため、2 つのメソッドは「異なる」型のパラメーター ( と など) を受け取るようにMyClassA::MyStructure
なりMyClassB::MyStructure
ました。MyClassC
のインスタンスで動作し、MyStructure
両方のメソッドを呼び出す必要がある 3 番目のクラスがある場合は、さらにキャッチーになります。このクラスは、このインスタンスをタイプMyClassA::MyStructure
、MyClassB::MyStructure
またはで宣言する必要がありますMyClassC::MyStructure
か?
ええと、私が知りたいのは、名前空間修飾子を取り除くためのベストプラクティスは何ですか?