注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一路

To find the final symmetry & beauty

 
 
 

日志

 
 
 
 

关于lazy instantiation,(推迟实例化)[原创]  

2011-02-15 14:49:21|  分类: c++学习笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

    这里只是想简单介绍一个这个C++特性,不做过于详细的说明。这个特性不但可以有效减小编译时间和编译期编译器所占的资源,还可以增强模版类的可用范围。什么叫推迟实例化呢,就是无论模版类工是模版函数,模版类的成员函数,只有用到的时候编译器才会把它们放在最终二进制代码中,不然这个定义就被忽略了。

下面是一个典型的例子:

//filename: lazy_instantiation.cpp

//written by saturnman

#include<iostream>

using namespace std;

template<typename T>

class Container

{

    public:

    T* ptr;

    void func()

    {

        ptr->func();

    }

};

class ClassA

{

    public:

    void func()//has func definition

    {}

};

class ClassB

{

    public:

        //no func definition

};

int main()

{

    Container<ClassA> c1;

    c1.func();

    //instantiation without error as ClassA has a func member function

    Container<ClassB> c2;

    //c2.func(); //uncomment this line to generate error message

   

    //instantiation with error as ClassB doesn't have a member function

    //called func() g++ generate the following error message.

   

    //C:\Users\saturnman\cpp\stl_note>g++ lazy_instantiztion.cpp

    //lazy_instantiztion.cpp: In member function 'void Container<T>::func() [with T =

    //ClassB]':

    //lazy_instantiztion.cpp:30:13:   instantiated from here

    //lazy_instantiztion.cpp:10:9: error: 'class ClassB' has no member named 'func'

//

    return 0;

}

 

 

代码中我已加了注释,Container类会调用其内部指针的func函数,但是如果这个指针所指类型没有这样一个函数,那 不就出错了吧,但是编译上述代码并不会出错,因为虽然ClassB没有这个一个叫func的成员函数,但是这个成员函数并没有被用到,因此有与没有都是一回事,编译器就不去检查这个错误了,有的编译器甚至于不去检查模版函数的语法错误,发果这个模版函数在程序中根本没有被用到。

Ref:

[1] 《C++ templates the complete guide》

  评论这张
 
阅读(754)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017