2017-10-31 8 views
1

私は、双方向イテレータの要件に準拠したカスタムイテレータクラスを用意していますが(ランダムアクセスではありません)しかし、2つのイテレータの距離は一定の時間内に見つけることもできます。概念的には、it2 - it1は効率的ですが、it += n(これらの演算子オーバーロードはどちらも実際に実装されていません)です。std :: distanceなどのstd関数をオーバーロードするのは合理的ですか?

std::distance()をオーバーロードして、標準ライブラリアルゴリズムがこのイテレータで効率的に距離を計算できるようにするのは妥当ですか?

std名前空間のものの改ざんの妥当性について、矛盾する情報が見つかりました。名前空間の使用に関して

+1

オーバーロード?いいえ、関数テンプレートを完全に特殊化しますか?うまくいくはずです。 – StoryTeller

+0

@StoryTellerありがとうございます。あなたが回答を投稿した場合、私はそれを受け入れます。 – Szabolcs

+0

私はしますが、答えに引用符を付したいと思います。 – StoryTeller

答えて

2

、神聖な標準は、この意見:

[namespace.std]/1(強調鉱山):Cの動作

を、それはSTDを名前空間に宣言や 定義を追加する場合++プログラムで定義されていません別の指定がない限り、名前空間std 内の名前空間に適用されます。宣言は、ユーザー定義型に依存し、 専門は 元のテンプレートのための標準ライブラリの要件を満たしていると明示的を禁止されていない場合プログラムは、 std名前空間に任意の標準ライブラリテンプレートのテンプレート 特殊化を追加することができます。

オーバーロードの追加は、新しい宣言であるため、許可されません。私は明示的な禁止を見つけることができませんでした。したがって、新しいイテレータタイプにstd::distanceファンクションテンプレートを完全に特化しても問題ありません。元のテンプレートの要件を満たしている限り、主な要件は、返される型がメタ関数で指定されたものと同じでなければならないということです。 std::iterator_traitsも専門にする必要があります。

関連する問題