成员检测码说明
Explanation on Member Detection code
这不是整个概念,而是用于确定类是否具有n
数据成员的方法之一。这里是完整的代码;SFINAE用于构件检测的常用方法。
template <typename T>
struct has_X {
struct Fallback { int X; };
struct Derived : T, Fallback {};
template <typename U, U> struct S;
template <typename C> static char (&f(S<int Fallback::*, &C::X> *))[1];
template <typename C> static char (&f(...))[2];
public:
const static bool value = sizeof(f<Derived>(0)) == 2;
};
Derived
从Fallback
和T
继承的部分让我感到困惑,因为当我们做f
的过载时,&C::X
是&Derived::X
。但是,这个重载不应该总是被选择吗?因为Derived
不是保证有X
吗?因为它继承自具有该数据成员的Fallback
。
也许我忽略了什么。然而,这一段代码向我展示并教会了我以前不知道的东西,所以也许是的一部分。我所期望的是总是选择过载(而不是与...
),因为Derived
应该始终具有X
,因为它继承自Fallback
。但事实并非如此。有人能解释一下为什么吗?
Fallback
有一个名为X
的数据成员,但是如果T
也有一个名为X
的成员,则Derived将有两个,在这种情况下,Derived::X
不能明确地取。因此,如果T
没有X
,则使用第一个重载,如果T
有X
,则使用第二个更通用的重载。这就是为什么您可以根据返回类型的大小来区分这些情况。
相关文章:
- 使用CMake检测支持的C++标准
- 当套接字连接断开时检测C/C++Unix
- C/C++预处理器是否可以检测一些编译器选项
- WMI检测进程创建事件-c++
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 下面是我为检测链接列表中的循环而制作的代码
- 当使用通配符和null指针调用函数时,对输出的说明
- 落砂模拟碰撞检测C++和SFML
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 为什么C++编译器没有检测到正确声明的类?
- 检测win32服务创建和删除的最佳方法
- 关于C++中具有多重继承"this"指针的说明
- 正在LLVM中检测整数比较条件
- 如何在鼠标挂钩过程中检测拖动
- 位移操作和位掩码未检测到重复字符
- 检测 COFF 对象文件中C++内联符号
- qmake:检测目标位宽(32 位或 64 位)
- 增强精神解析器规则以检测语句中的特殊结尾
- 用于C++的静态二进制检测或二进制重写工具和框架
- 成员检测码说明