zoukankan      html  css  js  c++  java
  • 《Effective C++》模版与泛型编程

    Item41:了解隐式接口和编译期多态
    纵使你从未使用过templates,应该不陌生“运行期多态”和“编译期多态”之间的差异。因为它类似于“哪一个重载函数该被调用(发生在编译期)”和“哪一个virtual函数应该被绑定(发生在运行期)”之间的差异。
    加诸于template参数身上的隐式接口,就像加诸于class对象身上的显式接口一样真实,而且两者都在编译期完成检查,就像你无法以一种“与class提供之显式接口矛盾”的方式来使用对象(代码将不会通过编译)。你也无法在template中使用“不支持template所要求之隐式接口”的对象(代码一样不能通过编译)。


    Item42:了解typename的双重意义

    template<typename C>
    void print2d(const C&container)//打印容器内的第二个元素
    {
        if(container.size()>=2){
        C::const_iterator iter(container.begin());
        ++iter;
        int value=*iter;
        std::cout<<value;
        }
    }

    iter的类型是C::const_iterator,实际是什么必须取决于template参数C,template内出现的名字如果相依与某个template参数,称之为从属名称,如果从属名称在class内呈现嵌套状,我们称之为嵌套从属名称,C::const_iterator就是这样一个名称,实际上它还是个嵌套从属类型名称。
    嵌套从属名称有可能导致解析困难,在我们知道C是什么之前,没有任何办法可以知道C::const_iterator是否为一个类型,而当编译期开始解析template print2d时尚未确定C是神恶魔东西,C++有个规则可以解析这一状态。
    如果解析器在template中遭遇一个嵌套从属名称,它便假设这个名称不是个类型,除非你告诉它是(用typename)。
    一般性规则很简单:任何时候当你想要在template中指涉一个嵌套从属类型名称,就必须在使用它的前一个位置上放上关键字typename。
    有一个例外:“typename必须作为嵌套从属类型名称的前缀词”,这一规则的例外是,typename不可能出现在base classes list内的嵌套从属类型名称之前,也不可能在member initialization list(成员初始化列表)中作为base class的修饰符。
    总结:①申明template参数时,前缀关键字clas和typename可以互换。
    ②请使用关键字typename来标志嵌套从属类型名称:但不能在base class lists(基类列表)或member initialization list内以它作为base class的修饰符。


    Item44:将参数无关的代码抽离templates
    总结:①template生成多个classes和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生依赖关系。
    ②因非类型模版参数而造成的代码膨胀,往往可以消除,做法是以函数参数或class成员变量替换template参数。
    ③因类型参数而造成的代码膨胀,往往可以降低,做法是让带有完全相同二进制长度的具现类型共享实现代码。


    Item45:运用成员函数模版接受所有兼容类型
    总结:请使用member function template(成员函数模版)生成“可接受所有兼容类型”的函数。
    如果你声明member template用于“泛化copy构造”或“泛化assignment操作”,你还是需要声明正常的copy构造函数和copy assignment操作符。


    Item46:需要类型转换时要将模版定义为非成员函数
    总结:当我们编写一个class template,而它所提供之“于此template相关的”函数支持“所有参数之隐式类型转换”时,请将那些函数定义为“class template 内部的friend函数”。


    Item47:请使用traits classes表现类型信息
    这一小结可以参考我的另一篇总结。

    https://github.com/li-zheng-hao
  • 相关阅读:
    (转)C3P0连接池配置和实现详解
    (转)jquery插件Validate的使用
    二叉树和翻转二叉树
    利用@media screen实现网页布局的自适应
    (转)防止SQL注入的五种方法
    java代码规范
    Java泛型-类型擦除
    js中的isNaN()
    (转)sublime 一些常用功能和快捷键
    (转)java中不常见的关键字:strictfp,transient
  • 原文地址:https://www.cnblogs.com/lizhenghao126/p/11053743.html
Copyright © 2011-2022 走看看