网站建设为中心,美工设计网页培训,广告设计图片创意,建一个信息 类网站条款47 #xff1a;请使用traits classes表现类型信息(Use traits classes for information about types) (1).Traits classes使得”类型相关信息”在编译期可用。它们以templates和”templates特化”完成实现。 (2).整合重载技术(overloading)后#xff0c;traits classes有…条款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用来保存数值类型的相关信息。
本质是面向编译器编程将尽可能多的运算放在编译期阶段减少运行期开销。
#include iostream
#include type_traits
// Traits 类定义
template typename T
struct TypeInfo {static const bool isInteger std::is_sameT, int::value;static const bool isString std::is_sameT, std::string::value;static const bool isFloat std::is_sameT, float::value;
};感觉示例不是很好需要从std源码去理解。sgi std的源码比较少vs std的比较多。考虑多看多参考才比较好理解这事。本质上是利用编译期在编译器对类型进行逻辑判断生成直接的代码。