C++ 模板";适配器“;在C++;
我目前在处理模板类时遇到了一个问题。在我目前使用的代码库中,我们有一行代码如下:C++ 模板";适配器“;在C++;,c++,templates,C++,Templates,我目前在处理模板类时遇到了一个问题。在我目前使用的代码库中,我们有一行代码如下: Register*myReg=static_cast(importItempt(someGlobalIdString)) 其中importItemPtr负责根据标识字符串从某个全局集合向项返回void* 问题是此代码现在将在某个平台上运行,其中someGlobalIdString引用的对象不再是Register类型,而是Register。这是必须在运行时作出的决定。因为我使用的是模板化类型,所以我不能有一个指针指向
Register*myReg=static_cast(importItempt(someGlobalIdString))代码>
其中importItemPtr负责根据标识字符串从某个全局集合向项返回void*
问题是此代码现在将在某个平台上运行,其中someGlobalIdString引用的对象不再是Register
类型,而是Register
。这是必须在运行时作出的决定。因为我使用的是模板化类型,所以我不能有一个指针指向寄存器
或寄存器
。所以我必须
拥有导入此寄存器的类的两个副本,一个处理uint32_t类型,另一个处理uint64_t类型。由于代码重复,这个解决方案显然很糟糕
模板化导入此寄存器的类。在理想情况下,这可能是正确的解决方案,但它并不真正符合“正常的做事方式”,其他同事可能更喜欢复制粘贴而不是模板化此类类李>
做一个适配器。子类Register
创建一个新类,该类接受Register
作为构造函数,基本上只包装该寄存器并返回64位值,而不是32位值。重写消费类以始终使用64位版本,当我们在提供32位版本的平台上时,只需将其包装。上面的代码段如下所示:
适配器:
类reg32to64适配器:公共寄存器{…}
消费阶层:
Register* myReg;
if( is32bitPlatform )
{
Register* my32Reg = static_cast*>(importItemPtr(someGlobalIdString));
myReg = new Reg32to64Adapter(my32Reg);
}else
{
myReg = static_cast*>(importItemPtr(someGlobalIdString));
}
//Go on manipulating myReg
有更好的解决办法吗?一些我不知道的设计模式?尝试使用桥接模式,其中实现者是常见操作的集合,专门化是具体的实现者
可能不是最好的解决方案(过度设计),所以请在使用前对其进行分析。为什么平台的位不是编译时常数?看起来有人在静态转换后吃掉了您的源代码块。无论如何,这是一个非常奇怪的问题。为什么必须记住值是32位还是64位?如果它是一个运行时变量,它应该是寄存器
的数据成员,而不是模板参数。如果importItempt(someGlobalIdString)
返回了正确的类型,而不需要强制转换,这不是更好吗?这也会解决你的问题。