一两年没碰编程了,最近开始写一个程序,写的过程中想到了一些东西。
看这段代码
这个一个用模板实现的协议类,拥有一个虚成员函数和一个虚析构函数,其功能可以用以下代码来测试
和协议类有点不同,这里的模板协议类语义上并不是指针,是不是省心很多?有了新标准的move语意的话,性能上也不会有什么问题。
这只是个很简单的实现,但已具有了一个协议类几乎所有的功能,并且在通用性上远高于协议类,它可以接受任意类型的对像,而不用考虑任何继承关系,唯一的要求只是付与的对像拥有看起来像是“int killTheBear(int)”这样的成员。
如果写成这样
这样一个函数既有泛型函数通用任何类型,同时类型安全的特点,又像普通函数一样有函数体,有2进制接囗,你甚至可以把它放在一个DLL中输出,可以算是“运行时泛型”吧。
下面是之后写的一个复杂一些的实现,有了全局的虚函数表,其中有两个子函数接口,一个虚析构函数,一个虚operator=(),一个代表类型的整型数值,若特化了TypeId模板,还可以实现dynamic_cast<type>语义。
可以通过下面代码来测试
如果说当时C++引进RTTI是回为用C原有的语法不能实现相应的功能,那么现在看来RTTI不过是模板功能的一个小子集,而且还是不完整的一个子集,那么RTTI是不是该从C++中扔掉了?
至少有个编译选项可以关掉RTTI和联带的一些带来坏影响的特性,那么在我们需要更好的功能和安全性,而代码量却不是关键时,也是个不错的选择吧。