关于如何使用此代码段实现 SFINAE 的问题

Question on how SFINAE is achieved using this code segment

本文关键字:实现 SFINAE 问题 段实现 于如何 代码      更新时间:2023-10-16

参考

荸荠属

该问题与以下代码段相关:

template<typename T>
class is_class {
typedef char yes[1];
typedef char no [2];
template<typename C> static yes& test(int C::*); // selected if C is a class type
template<typename C> static no&  test(...);      // selected otherwise
public:
static bool const value = sizeof(test<T>(0)) == sizeof(yes);
};

在上面的类模板定义中,is_class<T>::valuepublic定义test在类模板is_class实例化中使用的参数T实例化嵌套的静态模板函数。

如果上述解释是正确的,我有以下问题:

  1. 如何解释嵌套静态模板函数test的重载版本?

SFINAE 如何使用上述重载来填充给定T的模板类is_class<T>的公共布尔变量value,根据sizeof(test<T>(0)) == sizeof(yes),在适用的情况下使用 true 或 false?我不确定我是否理解如何在test<T>的实例化中传递看似随机的整数值0应该选择或消除任何一个重载?有人可以用一个例子来解释吗?

  1. 使用两种嵌套类型的yes[1]no [2]的逻辑,这两种类型都已被typedef'dchar我也不清楚。假设yes[1]是大小为 1 的 char 数组的类型别名,并且no[2]大小为 2 的 char 数组的类型别名,此逻辑如何集成到使用 SFINAE 的重载选择/消除中?

欣赏你的想法。

让我们澄清一些误解:

  1. yes[1]不是一种类型。yes是一种类型,它是char [1]的别名。
  2. no[2]不是一种类型。no是一种类型,它是char [2]的别名。

在过载解决方面,如果Tclass,则test(...)的优先级较低。因此,调用test<T>(0)将解析为第一个重载,其返回类型为yes&。因此

sizeof(test<T>(0)) == sizeof(yes)的计算结果
sizeof(yes) == sizeof(yes),计算结果为true

如果T不是一个类,则没有int T::*。这是SFINAE的部分。在这种情况下,选择test(...)作为重载,其返回类型为no&。因此

sizeof(test<T>(0)) == sizeof(yes)的计算结果为
sizeof(no) == sizeof(yes),计算结果为false