に対して 説得力のある議論があるusing namespace std
のに、なぜそれが言語に導入されたのでしょうか? using namespace
名前空間の目的を無効にしませんか? なぜ私は書きたいのusing namespace
ですか?using namespace
おそらく慣用句の行などで、エレガントに解決されることに気付いていない問題はありますusing std::swap
か?
6 に答える
一つには、これは名前空間(例えばusing namespace std::rel_ops;
またはusing namespace boost::assign;
)で演算子のオーバーロードを使用する方法です
簡潔さも強力な議論です。std::placeholders::_1
代わりにタイピングと読書を本当に楽しんでいます_1
か?また、機能的なスタイルでコードを書くときは、名前空間で無数のオブジェクトを使用することにstd
なります。boost
もう1つの重要な使用法(通常は名前空間全体をインポートしませんが)は、引数に依存するルックアップを有効にすることです。
template <class T>
void smart_swap(T& a, T& b)
{
using std::swap;
swap(a, b);
}
Tと同じ名前空間内のあるタイプのTに対してスワップがオーバーロードされている場合、これはそのオーバーロードを使用します。代わりに明示的に呼び出した場合std::swap
、その過負荷は考慮されません。他のタイプの場合、これはにフォールバックしstd::swap
ます。
ところで、あいまいな場合はいつでも名前を完全に修飾できるため、宣言/ディレクティブを使用しても名前空間の目的が損なわれることはありません。
ほとんどの場合、これはコードを記述するための単なるショートカットです。名前を囲んでいるコンテキストにインポートできます。.cpp
usingディレクティブを.h
ファイルに含めると、それが含まれているすべてのファイルが汚染されるため、通常はファイルに制限します。もう1つの良い方法はusing namespace
、メソッド本体宣言内など、可能な限り最も囲い込みのある環境に制限することです。私はそれを便利だと思っていますが、それ以上ではなく、次のような名前空間のエイリアシングに似ています。
namespace po = boost::program_options;
そして、あなたは書くことができます
po::variables_map ...
深くネストされた名前空間を持つライブラリを操作するときに便利だと思います。Boostライブラリはそのような例の1つです。boost::numeric::ublas::matrix<double> m
いたるところにタイピングする画像...
避けるべきことはusing namespace
、ヘッダーファイルで行うことです。これは、ヘッダーを含むプログラムを台無しにする可能性があるためです。ステートメントは常にusing namespace
.cpp/.cxxファイルに配置して、ファイルスコープに制限されるようにします。
人々は明確に反対しますが、反対しusing namespace std;
ませんusing namespace BigCorp
。または参照することstd::cout
(これは名前空間を使用していますusing
が、私の言いたいことがわかっている場合はそうではありません。)また、ほとんどの反対意見using namespace std
はヘッダーファイルにあります。影響がすぐにわかるソース ファイルでは、害は少なくなります。
名前空間は、私が使用しているライブラリに Date というクラスがあるにもかかわらず、Date というクラスを持つことができる非常に便利な概念です。それらが言語に追加される前に、GCDate
and GCString
(私の会社、Gregory Consulting、 predates std::string
) のようなものが必要でした。名前空間を (using
キーワードの有無にかかわらず) 利用することで、よりクリーンできれいなコードを書くことができます。Gregcons::string
しかし、毎回言わなければならないときは、よりきれいできちんとした部分を失います. [免責事項: 私は実際にはもう独自の文字列クラスを使用していません。適切な名前の競合を想像してください。]using
それがこのステートメントの魅力です。ヘッダーに含めないでください。 に適用しないでstd
ください。通常はトラブルを避ける必要があります。
「名前空間を使用すると、クラス、オブジェクト、関数などのエンティティを名前の下にグループ化できます。このようにして、グローバルスコープを「サブスコープ」に分割し、それぞれに独自の名前を付けることができます。識別子は有効な識別子であり、エンティティは一連の名前空間に含まれるクラス、オブジェクト、および関数」