1

私はいくつかの「パッケージ」で構成されているユーティリティライブラリを書いています。各パッケージのクラスは、さまざまな名前空間に含まれています。クラス宣言の最後にステートメントを使用して自動的に宣言することで状況を単純化する方法についての考えがあります(以下を参照)。これにより、プログラマーがcppファイルでそれを行う必要がなくなります。

namespace Utility
{
    class String
    {
        // Class Implementation
    };
}

using Utility::String;

私の理解では、ユーザーがヘッダーString.hを含み、StringがUtilityにある場合、プログラマーはStringを使用したいと思うでしょう。明らかに、名前空間を汚すファイルの束を含む外部のクラスチェーンがある場合、これは悪い可能性があるので、代わりに#defineにするのはどうでしょうか。

namespace Utility
{
    class String
    {
        // Class Implementation
    };
}

#ifdef AUTO_DECLARE_NAMESPACE
    using Utility::String;
#endif

そうすれば、この拡張機能が必要なプログラマーはそれを手に入れることができます。

これは良い考えですか、それとも私が見落としているものがありますか?

4

4 に答える 4

6

名前空間で宣言されたすべての名前にusing宣言を追加するだけの場合は、名前空間を使用しても意味がありません。

ヘッダーファイルのユーザーがヘッダーをどのように使用するかを決定できるようにします。誰かがusing宣言を使用したい場合は、.cppファイルで直接使用させてください。これにより、名前の由来が明らかになるため、その.cppファイルのコードがより明確になります。

于 2011-03-01T02:52:35.367 に答える
2

これはせいぜい無意味で、最悪の場合は迷惑なようです。

開発者に、使用する名前空間と完全に修飾するものを決定させることの何が問題になっていますか?

于 2011-03-01T02:59:12.963 に答える
0

正直なところ、それがusing namespace指令の目的だと思います。using namespaceディレクティブがまさにそれを行うことを考えると、このプリプロセッサメカニズムを追加する必要はありません。

于 2011-03-01T02:56:30.127 に答える
0

my_lib_import_names.hのようなすべての使用法を含む別の.hファイルを作成し、それを#includeして必要なものを取得することはできませんか?

クラスが宣言されていないという問題が発生する可能性がありますが、次のようなものを使用してバイパスすることができます。

#ifdef UTILITY_STRING_H_ 
  using Utility::String;
#endif
..
#ifdef UTILITY_SOMETHING_ELSE_H
   using Utility::SomethingElse;
#endif

..

どう思いますか?

そうすれば、ライブラリ.hで「期待される」動作を維持できるだけでなく、好きなように動作させることができます。また、クラスよりも名前空間の利点を維持することができます(新しい.hファイルを維持する必要があります)。

于 2011-03-03T02:47:59.657 に答える