读书笔记:Effective C++ 3.0版2005年Scott Meyers : 55条建议(47-55)

条款47 :请使用traits classes表现类型信息(Use traits classes for information about types)

(1).Traits classes使得"类型相关信息"在编译期可用。它们以templates和"templates特化"完成实现。

(2).整合重载技术(overloading)后,traits classes有可能在编译期对类型进行if...else测试。

Traits并不是C++关键字或一个预先定义好的构件;它们是一种技术,也是一个C++程序员共同遵守的协议。这个技术的要求之一是,它对内置(built-in)类型和用户自定义(user-defined)类型的表现必须一样好。类型的traits信息必须位于类型自身之外。标准技术是把它放进一个template及其一或多个特化版本中。这样的templates在标准程序库中有若干个,其中针对迭代器者被命名为iterator_traits。

iterator_traits是个struct,习惯上traits总是被实现为structs,但它们却又往往被称为traits classes。iterator_traits的运作方式是,针对每一个类型IterT,在struct iterator_tratis内一定声明某个typedef名为iterator_category。这个typedef用来确认IterT的迭代器分类。

设计并实现一个traits class:(1).确认若干你希望将来可取得的类型相关信息。例如对迭代器而言,希望将来可取得其分类(category)。(2).为该信息选择一个名称(例如iterator_category)。(3).提供一个template和一组特化版本(例如iterator_traits),内含你希望支持的类型相关信息。

如何使用一个traits class:(1).建立一组重载函数(身份像劳工)或函数模板(例如doAdvance),彼此间的差异只在于各自的traits参数。令每个函数实现码与其接受之traits信息相应和。(2).建立一个控制函数(身份像工头)或函数模板(例如advance),它调用上述那些"劳工函数"并传递traits class所提供的信息。

Traits广泛用于标准程序库。如iterator_traits,除了供应iterator_category还供应另四份迭代器相关信息(其中最有用的是value_type)。此外还有char_traits用来保存字符类型的相关信息,以及numeric_limits用来保存数值类型的相关信息。

本质是面向编译器编程,将尽可能多的运算放在编译期阶段,减少运行期开销。

c 复制代码
#include <iostream>
#include <type_traits>
// Traits 类定义
template <typename T>
struct TypeInfo {
    static const bool isInteger = std::is_same<T, int>::value;
    static const bool isString = std::is_same<T, std::string>::value;
    static const bool isFloat = std::is_same<T, float>::value;
};

感觉示例不是很好,需要从std源码去理解。sgi std的源码比较少,vs std的比较多。考虑多看多参考,才比较好理解这事。本质上,是利用编译期在编译器对类型进行逻辑判断,生成直接的代码。

相关推荐
三体世界9 分钟前
TCP传输控制层协议深入理解
linux·服务器·开发语言·网络·c++·网络协议·tcp/ip
你的冰西瓜27 分钟前
C++ 中最短路算法的详细介绍
c++·算法·图论·最短路
<但凡.42 分钟前
数据结构与算法之美:广义表
数据结构·c++·算法
大白的编程日记.2 小时前
【计算机基础理论知识】C++篇(二)
开发语言·c++·学习
C语言小火车3 小时前
野指针:C/C++内存管理的“幽灵陷阱”与系统化规避策略
c语言·c++·学习·指针
凤年徐3 小时前
【数据结构】时间复杂度和空间复杂度
c语言·数据结构·c++·笔记·算法
踏莎行hyx3 小时前
使用langchain连接llama.cpp部署的本地deepseek大模型开发简单的LLM应用
c++·ai·langchain·大模型·llama.cpp·deepseek
山河木马3 小时前
前端学C++可太简单了:双冒号 :: 操作符
前端·javascript·c++
乌萨奇也要立志学C++4 小时前
【C++详解】STL-list模拟实现(深度剖析list迭代器,类模板未实例化取嵌套类型问题)
c++·list
闻缺陷则喜何志丹4 小时前
【前缀和 BFS 并集查找】P3127 [USACO15OPEN] Trapped in the Haybales G|省选-
数据结构·c++·前缀和·宽度优先·洛谷·并集查找