C++ 部分C++;依赖项目中的模板专门化

C++ 部分C++;依赖项目中的模板专门化,c++,templates,specialization,C++,Templates,Specialization,假设我有一个库和多个依赖于该库的项目。库头已经有一些部分类专门化。我希望允许每个依赖项目使用其自己的部分专门化进行覆盖。出于性能原因,我需要静态地实现这一点。下面是一些简化的代码 库代码: template <class A, class B, class Enable=void> struct Widget; struct Foo { }; template <class B> struct Widget<Foo, B> { }; namespace

假设我有一个库和多个依赖于该库的项目。库头已经有一些部分类专门化。我希望允许每个依赖项目使用其自己的部分专门化进行覆盖。出于性能原因,我需要静态地实现这一点。下面是一些简化的代码

库代码:

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

struct Foo
{
};

template <class B>
struct Widget<Foo, B>
{
};
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>
    {
    };
}
模板
结构小部件;
结构Foo
{
};
模板
结构小部件
{
};
用户代码:

template <class B>
struct DoSpecialize;

template <class B>
struct Widget<Foo, B, enable_if< DoSpecialize<B> >::type
{
};
模板
结构专业化;
模板
结构小部件::类型
{
};

这里的问题是,我们最终得到了同一专门化的多个定义。我想我们需要一个
禁用\u if
的地方。我们怎样才能避免这种情况呢?

我建议通过分离层来解决这个问题。该库有自己的专门化,用户可以在需要时覆盖它们。如果可以接受,则库代码如下:

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

struct Foo
{
};

template <class B>
struct Widget<Foo, B>
{
};
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>
    {
    };
}
namespace impl
{
模板
结构小部件;
}
模板
结构小部件:impl::Widget{};
结构Foo
{
};
名称空间impl
{
模板
结构小部件
{
};
}

用户代码保持原样。

在最后一个专门化中,
B
确实是一个特定类型?不,它是一个模板参数。。。固定问题