Visual C++泛型编程实践(二)

2014-11-23 19:52:48 · 作者: · 浏览: 66
e <typename T>
Struct Type2Type
{
typedef T OriginalType;
};
   它没有任何数值,但其不同型别却足以区分各个Type2Type实体,而这正是我们所要的。现在,让我们来先解决addMember成员函数中的获取下一个可用ID号的函数,我们可以定义一个重载的函数如下:

size getNextMemberID(Loki:: Type2Type<Employee>)
//对应职员操作
{
  if (itsEmployees.empty())
   return 1;
  std::map<size,Employee*>::iterator it=itsEmployees.
  end();
  --it;
  return it->first+1;
}
size getNextMemberID(Loki:: Type2Type<Account>)
//对应帐户操作
略..

   相应的,删除类函数定义如下:

void delMember(size ID, Loki:: Type2Type<Account>)
void delMember(size ID, Loki:: Type2Type<Employee>)

   获取类函数定义如下:

Account* getMember(size ID, Loki:: Type2Type<Account>)
Employee* getMember(size ID, Loki:: Type2Type<Employee>)

   这样,我们的函数接口就比刚开始的方法更清晰,我们的大脑中要记住的函数名就要少多了。
   第二次改进:使用模板技术减少接口函数数量经过第一次的改进,我们的接口结构比初始的方案要更清晰,但它似乎还存在一个问题:软件大师Martin Fowler在他的著作《重构――改善既有代码的设计》中将之列为代码的坏味道之首――代码重复。我们可以看到,添加、删除、获取的函数实现中,几乎完全是一样的实现逻辑,只不过所操作的map变量不同而已,如下(以添加为例):

size addMember(Account* e); //添加帐户
{
  //获取下一个可用的ID