C++中的模板"Adapters"
Template "Adapters" in C++
我目前正面临一个处理模板类的问题。在我目前正在使用的代码库中,我们有这样一行:
Register<uint32_t>* myReg = static_cast<Register<uint32_t>*>(importItemPtr(someGlobalIdString));
其中importtemptr负责根据标识字符串从某个全局集合中返回一个void*。
问题是,这段代码现在将运行在一个平台上,在这个平台上,someGlobalIdString引用的对象将不再是Register<uint32_t>
类型,而是Register<uint64_t>
。这是必须在运行时做出的决定。因为我使用模板化类型,我不能有一个指针,可以指向Register<uint32_t>
或Register<uint64_t>
。所以我必须要么
- 有两个拷贝的类来导入这个寄存器,一个处理uint32_t类型,另一个处理uint64_t类型。这个解决方案显然很糟糕,因为代码重复。模板化导入该寄存器的类。在理想情况下,这可能是正确的解决方案,但它并不真正符合"正常的做事方式",其他同事可能更喜欢复制粘贴而不是模板化这种类型的类。创建一个适配器。子类
Register<uint64_t>
创建一个新类,接受Register<uint32_t>
作为构造函数,本质上只是包装寄存器并返回64位值而不是32位。重写消费类以始终使用64位版本,当我们在提供32位版本的平台上时,只需包装它。上面的代码段看起来像这样: class Reg32to64Adapter : public Register<uint64_t> { ... }
消费类:
<>以前
Register* myReg;
if( is32bitPlatform )
{
Register* my32Reg = static_cast*>(importItemPtr(someGlobalIdString));
myReg = new Reg32to64Adapter(my32Reg);
}else
{
myReg = static_cast*>(importItemPtr(someGlobalIdString));
}
//Go on manipulating myReg
之前有更好的解决方案吗?一些我不知道的设计模式?
尝试使用桥接模式,其中实现者是公共操作的集合,专门化是具体实现者。
http://en.wikipedia.org/wiki/Bridge_pattern可能不是最好的解决方案(过度设计),所以请在使用前分析。
相关文章: