(转载的朋友请注明本文出自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();
}
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();
}
};
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();
}
};