C++中的模板"Adapters"

Template "Adapters" in C++

本文关键字:Adapters C++      更新时间:2023-10-16

我目前正面临一个处理模板类的问题。在我目前正在使用的代码库中,我们有这样一行:

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

可能不是最好的解决方案(过度设计),所以请在使用前分析。