为什么type_traits使用结构实现
Why is type_traits implemented using structs
大多数类型特征都是使用结构和模板部分(或完全(专用化的。例如,std::is_same
实现为
template<typename>
struct is_same : false_type {};
template<typename T>
struct is_same<T, T> : true_type {}; // partial specialization
用法将是
bool are_equal = std::is_same<T, U>::value;
或
.. = std::is_same_v<T, U>;
这两者都有点丑。 起初我认为这是唯一的解决方案,然后我发现变量也可以部分专用(而函数不能(。 类型转换特征不能(明显地(是变量,但对于"信息"特征,为什么这不会比结构更好?
template<typename>
inline constexpr bool is_same = false;
template<typename T>
inline constexpr bool is_same<T, T> = true;
然后
bool are_equal = std::is_same<T, U>;
原因仅仅是历史原因。大多数类型特征在 C++11 中首先添加到库中。变量模板是在 C++14 年晚些时候添加的,更改实现是不可行的,因为这太向后不兼容了。因此,添加了带有_v
后缀的变量,这成为惯例。
添加新特征的方式相同,因为在任何库中保持一致性都很重要,更不用说标准库了。
有时,您需要一个类型,而不仅仅是基础bool
值。标签调度技术提供了简单示例:
void foo(std::true_type) { ... }
void foo(std::false_type) { ... }
foo(std::is_same<T, S>{});
如果std::is_same
只是一个bool
变量模板,那么这段代码就不会那么优雅。
请注意,类型和非类型参数不可互换。不能编写接受两者的一元模板。如果要构建一个成熟的编译时计算代数,则需要选择一种参数类型,并使所有模板仅接受该参数类型。
相关文章:
- 如何使用set实现无序数据结构?
- 如何从实现接口的模板化类实例访问结构
- C++ 在外部使用嵌套结构实现类函数
- C++ 中的 TRIE 数据结构实现
- 数据结构实现
- 为什么type_traits使用结构实现
- 在 c++ 中为结构实现索引器
- C 结构实现派生接口
- 为什么标准库不以无锁的方式为 8 字节以下的结构实现 std::atomic?
- 如何在 C++1x 中为类层次结构实现完全通用的访问者?
- 通过结构实现BST
- 以下 C++ 结构实现之间的区别
- STL如何用非线性数据结构实现反向迭代器去引用
- C++中的数据结构实现
- 编译器特定联合结构实现的标准替代方案
- C++指针返回结构实现:链表
- 为什么不应该以这种方式隐藏结构实现
- 理解数据结构实现代码
- 采用哪种数据结构实现双叶树类型
- c++中访问者模式的层次结构实现