1

Java では、名前空間を使用するのは非常に簡単です。Identソース ファイルで使用する修飾識別子ごとimport ns1.ns2.ns2.ns3.ns4.Ident;に、ファイルの先頭に を置きます。次に、ソース コードのあらゆる場所で (短い) 非修飾名を使用できます。このimportステートメントは、それが書き留められているファイルにのみ適用されるため、問題が発生することはありません。

ただし、C++ で名前空間修飾子を削除する最善の方法はよくわかりません。

最も明白な解決策は、おそらくusingandusing namespaceステートメントです。ただし、少なくともヘッダー ファイルの場合は、using ステートメントが記述される単一のファイルに限定されないため、これはかなり悪い解決策のようです。たとえばusing、実装が直接内部にあるヘッダー ファイルのみで構成されるスリムなライブラリの場合、または一般的なヘッダー ファイルの場合は除外されます。

これまでに使用した別のオプションは、クラスで使用する修飾名ごとに、クラスtypedefのプライベート セクションに対応するものを追加することです。したがって、このアプローチを Java と比較する場合、基本的に import ステートメント リスト全体を取得し、importwithtypedefを置き換えてクラス宣言に配置します。

ただし、メソッド宣言の型は対応するクラスのプライベート型であるため、厳密に言えば、クラスのユーザーは戻り値とパラメーター値の型を知らないため、このアプローチはあまり好きではありません。

OK、これですべてtypedefを公開できます。しかし、それぞれの型を何度も再定義するので、これはおそらくあまり良い考えではありません。構造体ns1::ns2::ns3::MyStructureと 2 つのクラスMyClassAMyClassB. 両方のクラスには、実際には のインスタンスをパラメータとして取るメソッドがありますns1::ns2::ns3::MyStructure。しかし、すべてのクラスは、長い修飾名を取り除くために使用する型を再定義するため、2 つのメソッドは「異なる」型のパラメーター ( と など) を受け取るようにMyClassA::MyStructureなりMyClassB::MyStructureました。MyClassCのインスタンスで動作し、MyStructure両方のメソッドを呼び出す必要がある 3 番目のクラスがある場合は、さらにキャッチーになります。このクラスは、このインスタンスをタイプMyClassA::MyStructureMyClassB::MyStructureまたはで宣言する必要がありますMyClassC::MyStructureか?

ええと、私が知りたいのは、名前空間修飾子を取り除くためのベストプラクティスは何ですか?

4

0 に答える 0