现代软件设计技术内容摘要:

bit3 = (N amp。 0x08) ? 1 : 0, bit2 = (N amp。 0x04) ? 1 : 0, bit1 = (N amp。 0x02) ? 1 : 0, bit0 = (N amp。 0x01) ? 1 : 0 }。 public: enum { nbits = bit0+bit1+bit2+bit3 }。 }。 int i = countBits13::nbits。 int countBits(int N) { int bit3 = (N amp。 0x08) ? 1 : 0, bit2 = (N amp。 0x04) ? 1 : 0, bit1 = (N amp。 0x02) ? 1 : 0, bit0 = (N amp。 0x01) ? 1 : 0。 return bit0+bit1+bit2+bit3。 } int i = countBits(13)。 Template技术 —— 计算 Compiletime functions • 一般原则: – 局部变量用 enum类型 – 循环转化为递归,结束条件为一个特化版本 • 也可以是多重循环,需要用到部分特化特性 – 条件分支用模板特化解决 – 效果:以类型为基础,实现各种操作 • 例如 – sin x = x x^3/3! + x^5/5! x^7/7! + … – 在编译时刻求 pow(x,y), 即 x的 y次方 Template技术 —— 计算 pow(x,y) templateint X, int Y struct ctime_pow { enum { result = X*ctime_powX, Y1::result }。 }。 templateint X struct ctime_powX, 0 { enum { result = 1}。 }。 用法: const int z = ctime_pow5,3::result。 Trait技术 • 定义一些“函数”,这些函数的参数和返回值都是类型 (type), 而不是数据 (data) • 例如:对于一个数组类,它的元素类型和平均数的类型不一定相同,可以用一个 trait class来建立这种映射关系 • 对应关系 – Average_type(T) T – Average_type(int) float • Trait的使用: Average的实现 Partial evaluation • 一个程序的计算分为两个部分 – 静态计算:在编译时刻执行 – 动态计算:在运行时刻执行 • 例如,计算立方体的体积 Template技术 —— 模板类作为基类 • 某种程度上可以代替模板特化 templatesize_t MAX_LEN class String : public Arraychar, MAX_LEN+1 { public : // additional functionality bool operator==(const StringMAX_LENamp。 rhs) { return strcmp(m_rg, ) ==0。 } } Template技术 —— 以模板参数作为基类 • 允许用户把自己的类插入到类层次的中间 • 用户提供基类,类库使用基类 templatetypename Base, typename Policy1 class Deriving : public BasePolicy1 { …… } C++ as a twolevel language • 将 type当作 firstclass value来对待 • 例如 –一种做法: 下面的句子 • typedef T T_average。 –相当于 • typedef T_average = T。 –实现了类型的赋值 Template技术 —— typelist from 《 Modern C++ Design》 • 以类型作为元素构成链 template class T, class U struct Typelist { typedef T Head。 typedef U Tail。 }。 • 例如 Length操作 template class TList struct Length。 template struct LengthNullType { enum { value = 0 }。 }。 template class T, class U struct Length TypelistT, U { enum { value = 1 + LengthU::value }。 }。 • typelist各种操作 – Length – TypeAt – IndexOf – Append – Erase – Replace – MostDerived – …... Template技术 —— typelist(续一 ) • typelist用法 define TYPELIST_1(T1) TypelistT1, NullType define TYPELIST_2(T1, T2) TypelistT1, TYPELIST_1(T2) define TYPELIST_3(T1, T2, T3) TypelistT1, TYPELIST_2(T2, T3) template class T1, class T2, template class class Unit class GenScatterHierarchyTypelistT1, T2, Unit : public GenScatterHierarchyT1, Unit , public GenScatterHierarchyT2, Unit { }。 template class AtomicType, template class class Unit class GenScatterHierarchy : public UnitAtomicType { }。 template template class class Unit class GenScatterHierarchyNullType, Unit { }。 Template技术 —— typelist(续二 ) • GenScatterHierarchy用法 template class T class Holder { T m_value。 }。 typedef GenScatterHierarchy TYPELIST_3(int, string, CustomClass), Holder MyTypeTree MyTypeTree GenScatterHierarchy int,Holder GenScatterHierarchy TYPELIST_2(string, C。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。