2

我一直在阅读C++ 模板元编程并做其中包含的练习,但遇到了一个问题。这个小例子可以看出问题的核心:

    template <class A, class B>
    struct C;

    template <class A>
    struct C<A,A>
    {
      typedef some_type type;
    };

    template <class A, class B>
    struct C<A*,B>
    {
      typedef some_other_type type;
    };

    int main()
    {
      C<int*,int*> c;
    }

这无法编译,因为 c 的类型不明确。编译器无法判断它应该实例化哪个特化,但是,我知道在这种情况下,我希望调用第一个特化。到目前为止我提出的解决方案是像这样重写它

    template <class A, class B>
    struct C;

    template <class A, class B>
    struct C<A*,B>
    {
      typedef typename boost::mpl::if_c<boost::is_same<A*,B>::value,
                                        some_type, some_other_type>::type type;
    };

这个解决方案的问题是我实际上对每个指针、常量、引用和数组类型都有部分特化,所以我不得不单独将此检查添加到每个特化中。

那么,我的问题是,是否有某种方法可以拥有以前的紧凑型特化并以某种方式对其进行调整,以便编译器实例化特化

     template <class A>
     struct C<A,A>
     {
       typedef some_type type;
     };

如果有歧义,而不是其他任何专业?

对于那些感兴趣的人,我正在研究的问题是第 2 章问题 1。

4

1 回答 1

2

您可以在基本模板中添加另一个参数并使用它来启用/禁用您的专业化。例如,您可能有:

template< class A, class B, class Enable = void >
struct C;
template< class A >
struct C<A, A, void> {...};
template< class A, class B >
struct C<A*, B, typename boost::disable_if<boost::is_same<A*, B> >::type> {...};

现在,如果您想处理 const 指针或其他任何东西,您可以根据类型特征(,,...)扩展您的is_const条件is_pointer

于 2012-10-16T03:40:40.583 回答