2016-12-09 11 views
4

SO上のスレッドは、extending std is UB(もちろん、あなたが標準的な作家でない限りはOKです)と言います。しかし時々、stdは喜んで拡張されます。いつそれはいいですか?C++ `std`名前空間を拡張するのはいいですか?

+0

related/dupe:http://stackoverflow.com/questions/320798/adding-types-to-the-std-namespace – NathanOliver

+0

@NathanOliverは関連していますが、欺瞞ではありません。これはまったく新しい質問ですが、私は驚いています。しかし、それは間違いなく良いものです。 – Walter

+0

あなたが間違いなく行うことができるのは、例えば 'std :: numeric_limits 'のような特定のテンプレートのための特殊化を提供することです。 – Walter

答えて

5

ためstd::hashの独自のspecialzations std名前空間に定義を追加するためにOKである場合のみ、すでに名前空間に存在するテンプレートの特殊化と明示的にテンプレートをインスタンス化します。ただし、ユーザー定義の型に依存している場合のみです。

[namespace.std](標準草案):特に指定のない限り、それは名前空間stdまたは名前空間std内の名前空間に宣言や定義を追加した場合

  1. C++プログラムの動作は未定義です。プログラムは、宣言がユーザ定義型に依存していて、専門化が元のテンプレートの標準ライブラリ要件を満たし、明示的に禁止されていない場合にのみ、標準ライブラリテンプレートのテンプレート特殊化を名前空間stdに追加できます。

  2. Cの挙動が

    (2.1)明示的な標準ライブラリクラステンプレートのメンバー関数の特殊化、または

    (2.2)任意の明示的な特殊化を宣言した場合++プログラムが未定義

    (2.3)標準ライブラリクラスまたはクラステンプレートのメンバクラステンプレートの明示的または部分的な特殊化。

    宣言がユーザー定義型の名前に依存し、インスタンス化が元のテンプレートの標準ライブラリ要件を満たしている場合にのみ、プログラムは標準ライブラリで定義されたテンプレートを明示的にインスタンス化できます。

    明示的にユーザ定義型のために拡張するように設計されている標準テンプレートの一例として

std::hashstd::iterator_traits

+0

cpp参照からの平文コピー... – Walter

+0

ありがとう、私は@ Jarod42から "期待している' std'のもののリストを尋ねようとしていましたが、これで十分です。 –

+0

C++ 11の 'make_unique'関数で' std'名前空間を拡張しました。[here](http://stackoverflow.com/questions/17902405/how-to-implement-make-unique-function-in -c11)。これは大丈夫ですか? –

2

カスタムデータ型にテンプレートの特殊化を設定できます。一例として、

std::unordered_map

関連する問題