模板重载和 SFINAE 仅适用于函数而不是类

template overloading and SFINAE working only with functions but not classes

本文关键字:函数 适用于 重载 SFINAE      更新时间:2023-10-16

有人可以解释为什么编译器只接受这段代码吗

template<typename L, size_t offset, typename enable_if< (offset<sizeof(L)), int >::type =0>
void a_function(){}
template<typename L, size_t offset, typename enable_if< (offset==sizeof(L)), int >::type =0>
void a_function(){}

但不是这个:

template<typename L, size_t offset, typename enable_if< (offset<sizeof(L)), int >::type =0>
class a_class{};
template<typename L, size_t offset, typename enable_if< (offset==sizeof(L)), int >::type =0>
class a_class{};

编译器将第二个类模板视为第一个类模板的重新定义。

您必须对类使用专业化。通常,它是使用一个额外的参数完成的:

template <class P, class dummy = void>
class T;
template <class P>
class T<P, typename enable_if<something, void>::type> {
   the real thing
};
具有相同名称的两个类(或类模板

(声明应始终声明相同的类或类模板(或者是专用化,在这种情况下它仍然是相同的模板(。

你可能想做这样的事情(ideone.com 链接(:

#include <iostream>
template< typename PL, size_t pOffset, int pC = int( sizeof(PL) ) - int( pOffset ) >= 0 ? ( int( sizeof(PL) ) - int( pOffset ) == 0 ? 0 : 1 ) : -1 >
class TClass
{
};
template< typename PL, size_t pOffset >
class TClass< PL, pOffset, -1 >
{
 public:
  static int const sI = -1;
};
template< typename PL, size_t pOffset >
class TClass< PL, pOffset, 0 >
{
 public:
  static int const sI = 0;
};
template< typename PL, size_t pOffset >
class TClass< PL, pOffset, 1 >
{
 public:
  static int const sI = 1;
};
int main(void )
{
 TClass< char, 0 > lC0;
 TClass< char, 1 > lC1;
 TClass< char, 2 > lC2;
 std::cout << lC0.sI << " : " << lC1.sI << " : " << lC2.sI << std::endl;
 return ( 0 );
}

程序输出:

1 : 0 : -1