模板高级编程
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");
}
};
继承类使用到了和动态绑定一样的特征,而且没有付出动态绑定的代价。
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");
}
};
继承类使用到了和动态绑定一样的特征,而且没有付出动态绑定的代价。
相关文章推荐
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 非阻塞的Socket通信Select模型(多路复用), 实用Socket通信模板。
- C++学习笔记6--高级强制类型转换 命名空间和模块化编程 C预处理器 链接和作用域 函数模板 类模板 内联模板 容器和算法
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 非阻塞的Socket通信EPoll模型(多路复用), 实用Socket通信模板
- Python学习笔记(七):高级特性、函数式编程、模板(快速入门篇)
- C++ 知识点(完):高级编程:模板,预处理器,信号处理,多线程,Web编程
- C++ 知识点(完):高级编程:模板,预处理器,信号处理,多线程,Web编程
- c++ 学习笔记(高级linux编程) day13
- “AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (中)
- (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
- javascript高级编程 小示例
- win7下安装yii2高级模板全过程
- UNIX环境高级编程之第5章:标准I/O库-习题
- UNIX环境高级编程-第4章- 文件和目录 - 三
- ASP.NET 2.0数据库高级编程(事务概述 )
- PHP 高级编程之多线程
- 读书笔记:Objective-C高级编程 iOS与OS X多线程和内存管理 ——(持续)
- UNIX环境高级编程之第6章:系统数据文件和信息
- 高级UNIX编程 的源文件使用
- UNIX环境高级编程-第5章- 标准 I/O 库
- 高级编程基础第六章作业--字典