0

我正在处理一个非常简单的模板结构,它的枚举值由它的 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

4

1 回答 1

4

您可以为 SpecialCase 添加一个特殊情况,其中参数相同:

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;
}
于 2012-12-13T16:58:09.210 回答