关于如何使用此代码段实现 SFINAE 的问题
Question on how SFINAE is achieved using this code segment
参考
荸荠属
该问题与以下代码段相关:
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
。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 为什么使用SFINAE而不是函数重载
- 使用简单类型列表实现的指数编译时间.为什么
- 如何使用模板函数的函数签名进行SFINAE
- 数据成员SFINAE的C++17测试:gcc vs clang
- 使用在用于SFINAE的void_t中具有参数的方法
- 如何在BST的这个简单递归实现中消除警告
- 基于 SFINAE 的特征实现问题与函数模板重载
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 关于如何使用此代码段实现 SFINAE 的问题
- 模板函数重载和 SFINAE 实现
- 使用 SFINAE 实现 get_as() 的 ConfigParser<type>
- 在 if-else 块中实现类似 SFINAE 的效果
- 使用 SFINAE 在 Clase 模板中选择不同的方法实现
- 如果未实现除法运算符,则SFINAE回退
- SFINAE使用模板、专门化和实现类型擦除
- 使用SFINAE选择要实现的接口