別な名前空間での特殊化

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のように、自分の名前空間専用に、異なる名前空間のクラスを特殊化するわけではないようです。

参照