如何用SFINAE区分函数类型 我正在读C++模板。它提到了SFINAE(替换失败不是错误)主体可用于检测函数类型。 代码示例: template <typename T> class IsFunctionT { private: typedef char One; typedef struct { char a[2]; } Two; template<typename U> static One test(...); template<typename U> static Two test(U (*)[1]); // This test overloading I cannot understand public: enum { Yes = sizeof(IsFunctionT<T>::test<T>(0) == 1}; enum { No = !Yes }; }; 模板 类是函数T{ 私人: 类型1; typedef结构{char a[2];}Two; 模板静态一次试验(…); 模板静态两个测试(U(*)[1]);//这个测试重载我无法理解 公众: 枚举{Yes=sizeof(IsFunctionT::test(0)=1}; 枚举{No=!Yes}; };

如何用SFINAE区分函数类型 我正在读C++模板。它提到了SFINAE(替换失败不是错误)主体可用于检测函数类型。 代码示例: template <typename T> class IsFunctionT { private: typedef char One; typedef struct { char a[2]; } Two; template<typename U> static One test(...); template<typename U> static Two test(U (*)[1]); // This test overloading I cannot understand public: enum { Yes = sizeof(IsFunctionT<T>::test<T>(0) == 1}; enum { No = !Yes }; }; 模板 类是函数T{ 私人: 类型1; typedef结构{char a[2];}Two; 模板静态一次试验(…); 模板静态两个测试(U(*)[1]);//这个测试重载我无法理解 公众: 枚举{Yes=sizeof(IsFunctionT::test(0)=1}; 枚举{No=!Yes}; };,c++,sfinae,C++,Sfinae,我知道它的目的是查找不能归类为数组的函数,但它如何与U(*)[1]一起工作。我以前从未见过这种情况。U()[1]是指向1元素数组的未命名指针。0被视为指向U()[1]的int或null指针 sizeof正在测试函数返回类型,测试函数的实际结果没有用作test()从不实际调用,只测试其返回类型。简而言之,SFINAE的工作方式是替换类型,并且在表达式格式错误时不给出硬失败。例如,您不能有函数数组,因此如果U是一个函数,则替换将失败,重载将被丢弃。现在作为注释点您发布的代码并不能涵盖所有情况。您需要

我知道它的目的是查找不能归类为数组的函数,但它如何与
U(*)[1]
一起工作。我以前从未见过这种情况。

U()[1]是指向1元素数组的未命名指针。0被视为指向U()[1]的int或null指针


sizeof正在测试函数返回类型,测试函数的实际结果没有用作test()从不实际调用,只测试其返回类型。

简而言之,SFINAE的工作方式是替换类型,并且在表达式格式错误时不给出硬失败。例如,您不能有函数数组,因此如果
U
是一个函数,则替换将失败,重载将被丢弃。现在作为注释点您发布的代码并不能涵盖所有情况。您需要额外的专门化,即:

template<typename T>
class IsFunctionT<T&> {
  public:
    enum { Yes = 0 };
    enum { No = !Yes };
};

template<>
class IsFunctionT<void> {
  public:
    enum { Yes = 0 };
    enum { No = !Yes };
};

template<>
class IsFunctionT<void const> {
  public:
    enum { Yes = 0 };
    enum { No = !Yes };
};
模板
类是函数T{
公众:
枚举{Yes=0};
枚举{No=!Yes};
};
模板
类是函数T{
公众:
枚举{Yes=0};
枚举{No=!Yes};
};
模板
类是函数T{
公众:
枚举{Yes=0};
枚举{No=!Yes};
};

我从免费提供的中提取了它。

我认为问题在于它为什么工作,而不仅仅是指针。你不能有函数数组,这就是替换失败的地方。我认为这个模板不能按预期工作。例如,引用也不能归类为数组,因此引用类型将被视为s函数类型。仍不包括右值引用。也不包括
volatile void
const volatile void
。请与本书作者联系,而不是我。