c++ - 这个 typedef 是什么意思,它有什么用?

标签 c++ templates metaprogramming

我偶然发现了这个 typedef:

typedef char (&small)[1];
typedef char (&large)[2];

我知道 & 是引用限定符或操作符地址。由于我们在这里处理类型,我猜它是一个引用,但是括号是否有特殊用途?

在上下文中我从它那里得到它用于执行类型可转换性的编译时检查,这个 typedef 在这件事上有什么帮助?

最佳答案

typedef 定义对 char 数组的引用:small 是一个包含 charlarge 作为两个 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)) };
};

测试在语义上可能不太准确,但想法是:在 sizeof() 操作中调用重载函数并测试结果的大小。根据选择的重载,可以确定类型属性的存在。使用对数组的引用有一个很好的属性,即可以预测它们的大小(1 和 2 分别表示 smalllarge)。例如,使用内置类型的大小并不能可靠地工作,因为它们可能都具有相同的大小。

... 而且,是的,括号很重要:没有括号,创建引用数组而不是对数组的引用将是非法尝试。只有后者给出了之后的尺寸保证。

关于c++ - 这个 typedef 是什么意思,它有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17798488/

相关文章:

c++ - 转换元组类型

c++ - 退出功能不起作用

c++ - 输入关系数组

c++ - Libzip - 归档错误总是返回 ZIP_ER_OK,即使创建归档失败

objective-c - 如何自动链接框架或库

C++ 重写模板类的成员访问运算符并按引用返回

c++ - 模板实例化失败 : compiler choosing improper overload function

c++ - 使用 std::hash<std::thread::id>()(std::this_thread::get_id())

Python,将Python代码字符串导入为模块

groovy - 在类的所有实例方法中隐式使用 Groovy Category