需要"override"案例时重叠模板部分专用化:如何避免错误?

Overlapping template partial specialization when wanting an "override" case: how to avoid the error?

本文关键字:错误 专用 何避免 板部 案例 override 重叠 需要      更新时间:2023-10-16

我正在处理一个非常简单的模板结构,该结构的枚举值由其 2 个模板参数是否相同类型来设置。

template<typename T, typename U> struct is_same { enum { value = 0 }; };
template<typename T> struct is_same<T, T> { enum { value = 1 }; };

这是库(Eigen)的一部分,所以我无法在不破坏它的情况下更改此设计。 当value == 0时,静态断言中止编译。

所以我有一个特殊的数字模板类SpecialCase,它可以对自己的不同专业进行操作。 所以我设置了一个这样的覆盖:

template<typename T> struct SpecialCase { ... };
template<typename LT, typename RT> struct is_same<SpecialCase<LT>, SpecialCase<RT>> { enum { value = 1 }; };

但是,这会引发错误:

more than one partial specialization matches the template argument list

现在,我明白为什么了。 就是这种情况,LT == RT踩在is_same<T, T>的脚趾上。 我不知道的是,如何保持我的SpecialCase覆盖并摆脱错误。 有没有解决这个问题的技巧?

编辑:为了澄清,我需要所有LT != RT也被视为相同的情况(值为 1)。 不仅仅是LT == RT.

您可以为参数相同的特殊情况添加特殊情况:

template < typename T >
struct is_same < SpecialCase < T >, SpecialCase < T > >
{ enum { value = 1 }; };

这比每个模棱两可的候选人都更具体。

编辑:这是完整的代码:

#include <iostream>
template<typename T, typename U> struct is_same {
    enum { value = 0 };
};
template<typename T> struct is_same<T, T> {
    enum { value = 1 };
};
template<typename T> struct SpecialCase {  };
template < typename T >
struct is_same < SpecialCase < T >, SpecialCase < T > >
{
  enum { value = 1 };
};
template<typename LT, typename RT> struct is_same<SpecialCase<LT>, SpecialCase<RT> > {
    enum { value = 1 };
};
int main ( int, char** )
{
std::cout 
<< is_same < SpecialCase < int >, SpecialCase < int > >::value
<< is_same < SpecialCase < int >, SpecialCase < double > >::value
<< is_same < SpecialCase < int >,  double >::value
<< is_same < double, SpecialCase < int > >::value
<< is_same < double, double >::value
<< is_same < double, int >::value
<< std::endl;
return 0;
}