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 回答