参考
荸荠属
该问题与以下代码段相关:
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>::value
的public
定义test
在类模板is_class
实例化中使用的参数T
实例化嵌套的静态模板函数。
如果上述解释是正确的,我有以下问题:
- 如何解释嵌套静态模板函数
test
的重载版本?
SFINAE 如何使用上述重载来填充给定T
的模板类is_class<T>
的公共布尔变量value
,根据sizeof(test<T>(0)) == sizeof(yes)
,在适用的情况下使用 true 或 false?我不确定我是否理解如何在test<T>
的实例化中传递看似随机的整数值0
应该选择或消除任何一个重载?有人可以用一个例子来解释吗?
- 使用两种嵌套类型的
yes[1]
和no [2]
的逻辑,这两种类型都已被typedef'dchar
我也不清楚。假设yes[1]
是大小为 1 的 char 数组的类型别名,并且no[2]
大小为 2 的 char 数组的类型别名,此逻辑如何集成到使用 SFINAE 的重载选择/消除中?
欣赏你的想法。
让我们澄清一些误解:
yes[1]
不是一种类型。yes
是一种类型,它是char [1]
的别名。no[2]
不是一种类型。no
是一种类型,它是char [2]
的别名。
在过载解决方面,如果T
是class
,则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
。