您的位置:首页 > 编程语言

模板高级编程

2008-06-06 22:24 225 查看
模板提供了神奇的功能:

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");
}
};

继承类使用到了和动态绑定一样的特征,而且没有付出动态绑定的代价。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐