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)
    返回了正确的类型,而不需要强制转换,这不是更好吗?这也会解决你的问题。