模板高级编程

模板提供了神奇的功能:

 template <typename T>
 T min(const T& a,const T& b);

这是很基本的东西,我这里说的高级编程是三个高级用法,这都来自Loki或ATL的提醒,我只是简单总结了一下我的理解。

1.隐藏参数细节

模板代码和使用代码一般是这样的:

template <class SomeClass>
class MyClass
{
public:
};

MyClass<YourClass> mc;

为了让终端用户使用的时候少写这个尖括号朋友,我们有如下三种办法:

a.

class  ReClass :public MyClass<YourClass>
{
};

b.

typedef MyClass<YourClass>  ReClass

c.

template <class SomeClass = YourClass>
class MyClass
{
public:
};

2.policy策略

policy是通过把具体特定行为的类作为模板参数让模板类在处理特定问题的时候使用该特定行为的手段。

template <class T>
class Compare1
{
public:
 static bool compare(const T& a,const T& b);
};
template <class T>
class Compare2
{
public:
 static bool compare(const T& a,const T& b);
};

template <class T,class ComPolicy = Compare1>
class TeClass
{
public:
 T min(const T& a,const T& b)
 {
  if(ComPolicy::compare(a,b))
   return a;
  else
   return b;
 }
};

3.模拟动态绑定

模拟动态绑定是让行为上看起来有动态绑定,但其实工作是在编译阶段做的的一种手段,动态绑定要付出代价,而模板消耗的是编译阶段的时间。

ATL疯狂的使用这个,因为这甩掉了效率上的包袱,C++程序员天生就有关注效率的义务,从各个方面来说,模拟动态绑定的策略意义重大。

从某种程度上来说,模拟动态绑定是让基类知道或者说是使用上了继承类的某些属性或方法。

template <class INHERIT>
class TestBase
{
public:
 void tellYourInfo()
 {
  static_cast<INHERIT*>(this)->tell();
 }
};

class TheTest  :public TestBase<TheTest>
{
public:
 void tell()
 {
  printf("I am TheTest::tell/n");
 }
};

class TheTestPlus :public TestBase<TheTestPlus>
{
public:
 void tell()
 {
  printf("I can do anything/n");
 }
};

继承类使用到了和动态绑定一样的特征,而且没有付出动态绑定的代价。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值