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

时间:2013-03-01 14:38:42

标签: c++ templates specialization

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

图书馆代码:

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<>。我们怎么能避免这种情况呢?

1 个答案:

答案 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>
    {
    };
}

并且用户代码保持原样。