Effective C++第七章-模板和泛型编程之模板特化和代码膨胀
来源:互联网 发布:javascript引用ku 编辑:程序博客网 时间:2024/06/05 10:01
模板特化
class A{public: void func1(); void func2();};class B{ public: void func1(); void func2();};template<typename company>class manager{public: void dofun1() { company c; c.fun1(); } void dofun2() {...}};template<typename company>class bettermanager : public manager<company>{public: void dobetterfun1() { dofun1();//调用模板化基类:manager<company>的函数,无法通过编译 }};
问题在于,当编译器遇到bettermanager类的定义式时,由于不知道模板化基类manager< company >中的模板参数company 的值,因此不知道继承的是什么样的class,就无法知道manager< company >是否有dofun1函数。
比如说:
class C{public: void func2();};//一个针对类型C特化的manager,而且特化是全面性的,也就是说一旦类型参数被定义为C,再没有其他模板参数可供变化template<>class manager<C>{public: void dofun2(){...}};
此时的bettermanager代码中,如果class bettermanager : public manager< company >的company是C,manager< C >模板化基类没有dofun1函数。
因此C++拒绝这个调用的原因:它知道base class template(manager< company >)有可能被特化(C),而那个特化版可能不提供和一般性template相同的接口。
模板参数造成的代码膨胀(代码膨胀=相同部分的重复)
两个函数或类中的某些部分的实现码实质相同时,可以抽出两个函数或类中共同部分,放进新的函数或类,然后令两个函数调用新函数或使用继承或复合取用新类。但是在模板代码中,重复是隐晦的:毕竟只存在一份模板源码,所以必须训练自己去感受当模板被具体实现化多次时可能发生的重复。
template<typename T,std::size_t n>//n为非类型模板参数,T为类型模板参数class A{...};
Template生成多个classes与多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系。
- 因非类型模板参数而造成的代码膨胀,往往可以消除,做法是以函数参数或者class成员变量替换template参数。
- 因类型参数而造成的代码膨胀,也可以降低,做法是让带有完全相同二进制表述的具现类型共享实现码。
阅读全文
0 0
- Effective C++第七章-模板和泛型编程之模板特化和代码膨胀
- Effective C++第七章-模板和泛型编程之模板中实现继承
- Effective C++第七章-模板和泛型编程之traits和TMP(模板元编程)
- Effective C++第七章-模板和泛型编程之typename与嵌套从属名称
- 《Effective C++》第七章:模板与泛型编程
- 模板特化降低代码膨胀
- C++—模板特化和偏特化
- Effective C++第七章-模板和泛型编程之需要类型转换时请为模板定义非成员函数
- 模板和模板特化
- 模板和模板特化
- 模板和模板特化
- 模板和模板特化
- Effective C++(七)模板和泛型编程
- Effective C++之模板和泛型编程
- Effective C++第七章-模板和泛型编程之编译期多态(运行期多态)和隐式接口(显式接口)
- 模板特化和偏特化
- 模板特化和偏特化
- 模板特化和偏特化
- Ubuntu14.04安装OpenCV3.0
- matplotlib 3D 数据
- vim_命令大全
- (转载)总结C++中的几种结构体初始化的方法
- 贝塞尔曲线
- Effective C++第七章-模板和泛型编程之模板特化和代码膨胀
- 关于Unity代码优化
- 使用matplot画柱状图
- excel 2007(32位) 在用obdc connector 连接mysql 64位的时候报错: 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
- Androidstudio下的app module 被另一个app依赖为library
- Qt中的槽
- Hadoop伪分布配置
- 大数据-运行Hadoop伪分布式实例
- free命令