mel*_*el- 3 c++ templates metaprogramming
我偶然发现了这个typedef:
typedef char (&small)[1];
typedef char (&large)[2];
Run Code Online (Sandbox Code Playgroud)
我知道&
作为参考限定符或运算符地址.既然我们在这里处理类型,我猜它是一个参考,但括号有特殊用途吗?
在上下文中,我从中获取它用于执行类型的可转换性的编译时间检查,这种typedef如何帮助解决这个问题?
该typedef
小号定义引用的数组char
:small
是一个数组char
并large
作为两种的阵列char
.typedef
这种类型的目的是让它们根据重载从属性检查器返回:如果属性存在,则返回一个,否则返回另一个.然后将结果用于sizeof()
确定属性,例如:
template <typename B, typename S>
struct is_base_of_helper {
static small test(B*);
static large test(void*, ...);
};
template <typename B, typename S>
struct is_base_of {
enum value { 1 == sizeof(is_base_of_helper<B, S>::test(static_cast<S*>(0)) };
};
Run Code Online (Sandbox Code Playgroud)
测试可能在语义上不是很准确,但想法是:在sizeof()
操作中调用重载函数并测试结果的大小.根据选择的过载,可以确定类型属性的存在.使用引用阵列具有很好的特性,它们的尺寸可被(1和2预测small
和large
分别).例如,使用内置类型的大小不能可靠地工作,因为它们都可以具有相同的大小.
...,是的,括号内容:没有括号,创建引用数组而不是引用数组将是非法尝试.只有后者给出尺寸保证,这是后.
归档时间: |
|
查看次数: |
149 次 |
最近记录: |