假设我有一个库和多个依赖于该库的项目。库头已经有一些部分类特化。我想允许每个依赖项目覆盖自己的部分特化。出于性能原因,我需要静态地实现这一点。下面是一些简化的代码。
图书馆代码:
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<>
。我们怎么能避免这种情况呢?
答案 0 :(得分: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>
{
};
}
并且用户代码保持原样。