利用C++模板,代替虚函数,实现类的静态多态性(加入性能测试部分)

本文探讨了如何使用C++模板来实现类的静态多态性,作为替代虚函数的一种方式。通过示例代码展示了模板在实现多态方面的灵活性,并进行了性能测试。测试结果显示,优化后的模板实现比虚函数在性能上高出约十倍,但作者指出在复杂场景下,仍建议首选虚函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     (转载的朋友请注明本文出自code_pipeline的博客,写一篇原创文章不容易啊~~:-) )
      熟悉模板编程的朋友或许听到过这个技巧或者模式:Barton-Nackmann 技巧或者称 奇异循环模板模式(Curiously Recurring Template Prattern)。
     其实在 《c++ 编程语言》这本bible 书里,在模板那章提到过一个很奇妙的类的实现,用的就是这个技术。当时,我就被C++模板技术叹为观止。近期在学boost库时偶然碰到了这个技巧,同时在写一个类时引发了我的思考,这里就利用这个技巧来实现,静态多态函数(我自己发明的叫法,呵呵)。
 我们知道C++的多态函数会带来很多灵活性,但是不可避免的它是有运行时的性能损失的。 而c++的另一个强大特性就是模板了。模板给C++带来了,编译时的多态,通过模板元编程,C++可以实现类似C#,java的refection的特性。这里我就举来实现利用模板来代替虚函数。
 例子1:

#include  < iostream >
 
using   namespace  std;
 
 
class  common_base
 {
 
public :
  
virtual   void  fun() = 0
 };
 
class  common_derive: public  common_base
 {
 
public :
  
void  fun()
  { cout
<< " in common_derive fun() " << endl;
 };
 
 
void  main()
 {
  common_base 
*  pb  =   new  common_derive;
  pb
-> fun();
 }

  这是一个最普通的多态例子,下面看看一个比较有意思的例子:
例子2:

template < typename T >
class  class1
{
public :
    class1(T t):m_val(t){}
    
virtual  T getVal(){
        cout
<< " in class1,val == " <<  m_val  << endl;
        
return  m_val;
    }
private :
    T m_val;
};

class  derived:  public  class1 < int >
{
public :
    derived(
int  i):class1 < int > (i){}
    
int  getVal()
    {
        cout
<< " in derived " << endl;
        
return  class1 < int > ::getVal();
    }
};

template
< typename T >
class  derived2:  public  class1 < T >
{
public :
    derived2(T val):class1
< T > (val){}
    T getVal()
    {
        cout
<< " in derived2 " << endl;
        
return  class1 < T > ::getVal();
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值