3

ライブラリと、そのライブラリに依存する複数のプロジェクトがあるとします。ライブラリ ヘッダーには、すでにいくつかの部分的なクラスの特殊化があります。各依存プロジェクトが独自の部分的な特殊化でオーバーライドできるようにしたいと考えています。パフォーマンス上の理由から、これをすべて静的に達成する必要があります。いくつかの簡略化されたコードを以下に示します。

ライブラリ コード:

template <class A, class B, class Enable=void>
struct Widget;

struct Foo
{
};

template <class B>
struct Widget<Foo, B>
{
};

ユーザーコード:

template <class B>
struct DoSpecialize;

template <class B>
struct Widget<Foo, B, enable_if< DoSpecialize<B> >::type
{
};

ここでの問題は、同じ専門化の複数の定義になってしまうことです。disable_if<>どこかに必要だと思います。どうすればこれを回避できますか?

4

1 に答える 1

1

レイヤーを分離して解決することをお勧めします。ライブラリには独自の特殊化があり、ユーザーは必要に応じてそれらを上書きできます。これが許容される場合、ライブラリ コードは次のようになります。

namespace impl
{
    template <class A, class B, class Enable=void>
    struct Widget;
}

template <class A, class B, class Enable=void>
struct Widget : impl::Widget< A, B > {};

struct Foo
{
};

namespace impl
{
    template <class B>
    struct Widget<Foo, B>
    {
    };
}

ユーザーコードはそのままです。

于 2013-03-01T16:21:09.437 に答える