c++的 Type Traits (一)

Type Traits 是什么意思?Trait 又是什么?

Trait 的字面意思是"特征、特性、特质"。在编程里,它指对"某个类型或对象具备什么性质/能力"的抽象描述。不同语言里这个词的含义差别不小,最常见的是 C++ 的 type traits。

C++ 的 Type Traits

C++ 的 type traits(头文件 <type_traits>)是一组模板类和变量模板,让你在编译期查询、判断、转换类型的特性,是模板元编程和 SFINAE 的基础设施。大致分三类:

  • 判断类 :std::is_integral<T>(T 是整型吗)、std::is_pointer<T>、std::is_same<T, U>、std::is_constructible<T, Args...>
  • 变换类 :std::remove_const<T>、std::add_pointer<T>、std::decay<T>、std::conditional<B, T, U>
  • 辅助工具 :std::enable_if、std::void_t、std::declval

典型用法

根据类型特性选择重载:

cpp 复制代码
#include <type_traits>

template <typename T>
std::enable_if_t<std::is_integral_v<T>, int>   // C++17 写法
f(T x) { return 1; }   // 只有 T 是整型时这个函数才存在

版本演进

  • C++11 :正式引入 <type_traits>(之前是 Boost.TypeTraits / TR1)
  • C++14 :加了 _t 别名(如 enable_if_t)
  • C++17 :加了 _v 变量模板(如 is_integral_v)
  • C++20 :Concepts 在很多场景下取代了 enable_if 的写法

其他语言里的 Trait

语言 Trait 的含义
Rust 定义共享行为的接口(类似 Java interface),同时用作泛型约束,可以带默认方法和关联类型
Scala 类似 Java interface,但可有方法实现和字段,支持 mixin 混入组合
PHP 纯粹的代码复用机制,把一组方法"复制"进使用它的类,解决单继承下的水平复用问题

词源

这个词最早来自 Smalltalk 社区的研究(论文 Traits: Composable Units of Behavior),核心思想一致:把"一组特性/行为"抽出来独立描述,再组合到具体类型上。

C++ 的命名逻辑就是------类型(type)具备的特征(trait)。

相关推荐
akinggw14 小时前
libsherpacore - 基于 sherpa-onnx 的 C++ 语音交互静态库
c++·交互·语音识别
xiaoye-duck15 小时前
《C++ 项目:手写大模型接入 SDK》ChatGPT接口设计(中):全量响应实现和测试
网络·c++·语言模型·chatgpt
揽星河..15 小时前
【C语言】指针
c语言·开发语言
小小数媒成员15 小时前
UGUI原理(一)
开发语言·游戏·unity·游戏引擎
速易达网络15 小时前
Three.js 动画入门教学:从场景搭建到流畅动效
开发语言·javascript·ecmascript
東隅已逝,桑榆非晚15 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
福大大架构师每日一题15 小时前
excelize v2.11.1发布:Go 1.26.0起步,16项安全修复与嵌入对象能力全面升级
开发语言·安全·golang
Sarvartha15 小时前
集合概述 & Collection 接口
开发语言
lhbweilai16 小时前
QT项目(串口助手)
开发语言·qt
eggwyw16 小时前
C++相交链表和反转链表详解
开发语言·c++