c++打破模板专业化歧义

c++ break template specialization ambiguity

本文关键字:专业化 歧义 c++      更新时间:2023-10-16

我一直在阅读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;
};

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

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

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

而不是任何其他专业,以防出现歧义?

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

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

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_constis_pointer,…)扩展您的条件!