C++11 理解 (二十七) 之 用于元编程的类别属性
来源:互联网 发布:c 获取网络时间 编辑:程序博客网 时间:2024/04/28 00:54
对于那些能自行创建或修改本身或其它程序的程序,我们称之为元编程。这种行为可以发生在编译或运行期。C++ 标准委员会已经决定引进一组由模板实现的库,程序员可利用此一库于编译期进行元编程。
底下是一个以元编程来计算指数的例子:
template<int B, int N>struct Pow { // recursive call and recombination. enum{ value = B*Pow<B, N-1>::value };}; template< int B > struct Pow<B, 0> { // ''N == 0'' condition of termination. enum{ value = 1 };};int quartic_of_three = Pow<3, 4>::value;
许多算法能作用在不同的数据类别; C++ 模板支持泛型,这使得代码能更紧凑和有用。然而,算法经常会需要目前作用的数据类别的信息。这种信息可以通过类别属性 (type traits
) 于模板实体化时将该信息萃取出来。
类别属性能识别一个对象的种类和有关一个类别 (class) (或 struct) 的特征。头文件 <type_traits>
描述了我们能识别那些特征。
底下的例子说明了模板函数‘elaborate’是如何根据给定的数据类别,从而实体化某一特定的算法 (algorithm.do_it
)。
// 演算法一template< bool B > struct Algorithm { template<class T1, class T2> int do_it (T1 &, T2 &) { /*...*/ }}; // 演算法二template<> struct Algorithm<true> { template<class T1, class T2> int do_it (T1, T2) { /*...*/ }}; // 根據給定的型別,實體化之後的 'elaborate' 會選擇演算法一或二template<class T1, class T2> int elaborate (T1 A, T2 B) { // 若 T1 為 int 且 T1 為 float,選用演算法二 // 其它情況選用演算法一 return Algorithm<std::is_integral<T1>::value && std::is_floating_point<T2>::value>::do_it( A, B ) ;}
通过定义在 <type_transform>
的类别属性,自定的类别转换是可能的 (在模板中,static_cast
和 const_cast
无法适用所有情况)。
此种编程技巧能写出优美、简洁的代码; 然而除错是此种编程技巧的弱处: 编译期的错误信息让人不知所云,运行期的除错更是困难。
- C++11 理解 (二十七) 之 用于元编程的类别属性
- C++11 理解 (二十) 之 多元组类别
- 元数据的类别
- C++11 理解 (二十八) 之 用于计算函数对象返回类型的统一方法
- 二十七、配置元数据
- 我的编程之路(二十七) 国庆假期(二)
- 深入理解C++中变量的存储类别和属性
- 深入理解C++中变量的存储类别和属性
- Objective - C基础: 第四天 - 5.类别的基本认识之二
- java基础之内省(Introspector)操作javabean属性的理解(主要用于开发框架)
- c++OOP程序设计读书笔记之二:程序设计类别
- 我的编程之路(十七) 勇气
- objective-c中对类别category的理解
- Java并发编程系列之二十七:ThreadLocal
- 计算机图形学 (二) 图元的属性
- OpenGL 笔记(二) 图元的属性
- Objective-C 基础知识之 (十七):内存管理原则二
- Objective C 编程语言里面的类别的作用
- hadoop动态debug设置
- 大学生们,你的CEO也曾在教室中哭泣
- 在使用了母版页的内容页后,如何在javascript中调用服务器控件值
- 今天终于搞定asm 数据全部丢失的恢复了
- c++模板有函数模板和类模板
- C++11 理解 (二十七) 之 用于元编程的类别属性
- NCL绘制中国地图
- topo
- C++ 编码转换
- Android 连接Wifi和创建Wifi热点 demo
- Lucene 索引机制
- python手记(45)
- Erlang并发编程1
- x264编码后保存写入到.264文件中