N3867 Specializations and namespaces (Rev. 2)
名前空間指定の特殊化をできるようにしよう、という提案。
以下のようなプログラムの場合、std::hash
名前空間を特殊化するために、A::B
の名前空間を一旦閉じてstd
名前空間を開いて特殊化するのでめんどくさい:
namespace A { namespace B { /* ... */ class C { /* ... */ }; } } namespace std { template<> struct hash<A::B::C> { size_t operator()(A::B::C const &c) { /* ... */ } }; } namespace A { /* 再度名前空間を開いて、続く実装を行う */ namespace B { /* ... */ } }
このような問題に対応するため、自分の名前空間から、他の名前空間のクラス・関数を直接特殊化しよう、というのがこの提案。単なるシンタックスシュガーです。
namespace A { namespace B { /* ... */ class C { /* ... */ }; // std::hashクラスを特殊化する template<> struct ::std::hash<C> { std::size_t operator()(C const &c) { /* ... */ } }; /* ... */ } }
この提案の特殊化は、Scoped Concept Mapのように、自分の名前空間専用に、異なる名前空間のクラスを特殊化するわけではないようです。