C++0x Scoped Concept Map

コンセプトマップは、コンセプトを定義した名前空間でなくても定義できます。

たとえば、Boost名前空間で定義したFooableコンセプトは

namespace Boost {
    class Vector { ... };

    concept Fooable<class T> {
        void foo(T);
    }

    template <Fooable T>
    void algo_bar(T x);
}


コンセプトマップをShand名前空間で定義したり

// Shand.hpp
namespace Shand {
    concept_map Boost::Fooable<Boost::Vector> {
        void foo(Boost::Vector& v) { ... }
    }

    void algo()
    {
        Boost::Vector v;
        Boost::algo_bar(v); // Shand名前空間のコンセプトマップを使用する
    }
}

Lunatic名前空間で定義したりできます。

// Lunatic.hpp
namespace Lunatic {
    concept_map Boost::Fooable<Boost::Vector> {
        void foo(Boost::Vector& v) { ... }
    }

    void algo()
    {
        Boost::Vector v;
        Boost::algo_bar(v); // Lunatic名前空間のコンセプトマップを使用する
    }
}

コンセプトマップが異なる名前空間になるので、Shand.hppとLunatic.hppの両方をインクルードしても
ODR(定義は一つしかあってはいけないルール)違反にはなりません。

#include "Boost.hpp"
#include "Shand.hpp"
#include "Lunatic.hpp" // OK : ODR違反ではない

int main()
{
    Shand::algo();
    Lunatic::algo();
}

Scoped Concept Mapがあると、サードパーティのライブラリを
自分のライブラリの内部実装用に安全にコンセプトマップできます。


N2098 Scoped Concept Maps(日本語訳)

N2414 Proposed Wording for Scoped Concept Maps

C++0x言語拡張まとめ