C++ - 类型重新绑定(bind)解析的正确方法?

标签 c++

我有以下代码片段:

namespace X86X64
{
   struct IMM8 {};
}

namespace X86
{
    using namespace X86X64;

    struct RM8 {};

    template <class _Traits>
    struct MOV_Instruction
    {
        typedef typename _Traits::RM8 RM8;

        void mov(const RM8& rm, const IMM8& imm)
        {}
    };
}

namespace X64
{
  using namespace X86X64;

  struct RM8 {};
  struct RM64 {};

  struct Traits
  {
    typedef RM8 RM8;
  };

  struct MOV_Instruction : public X86::MOV_Instruction<Traits>
  {
     using X86::MOV_Instruction<Traits>::mov;

     void mov(const RM64& rm, const IMM8& imm)
     {}
  };
}

当我不使用特征时,我得到一个错误,编译器在实例化 MOV_Instruction 时找不到任何将 X64::RM8 转换为 X86::RM8 的运算符。

命名空间 X86 和 X64 必须有自己独立的 RM8 类型,具有不同的基础类型。

我只想使用:

using namespace X86 | X64

MOV_Instruction i;
i.mov(RM8(), IMM8());

并希望编译器根据使用的命名空间和 Koenig 查找选择正确的 RM8 类型。 如果没有特征来重新绑定(bind)或解析正确的类型,他们是否是更好的方法来做到这一点?

我可以让 X86::RM8 和 X64::RM8 成为同一类型,但我不想为此努力。

谢谢 马丁

最佳答案

This compiles fine using VC9: 

namespace X86X64 {
    struct IMM8 {};
}

namespace X86 {
    using namespace X86X64;

    struct RM8 {};

    template <class Traits>
    struct MOV_Instruction {
        typedef typename Traits::RM8 RM8;
        void mov(const RM8& rm, const IMM8& imm) {}
    };
}

namespace X64 {
    using namespace X86X64;

    struct RM8 {};
    struct RM64 {};

    struct Traits {
        typedef RM8 RM8;
    };

    struct MOV_Instruction : public X86::MOV_Instruction<Traits> {
        using X86::MOV_Instruction<Traits>::mov;
        void mov(const RM64& rm, const IMM8& imm) {}
    };
}

int main()
{
    //using namespace X86; 
    using namespace X64;

    MOV_Instruction i;
    i.mov(RM8(), IMM8());

    return 0;
}

请注意,不能同时使用 using 指令,因为那样会使 MOV_Instruction 含糊不清。

此外,我将 _Traits 更改为 Traits,因为以下划线开头,后跟大写字母的标识符是为实现保留的。 (您可能会从某些 header 中吸引一个宏来破坏您的代码并导致非常奇怪的编译器错误。)

关于C++ - 类型重新绑定(bind)解析的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3594507/

相关文章:

c++ - 如何使用 thrift C++ API 在 HBase 中存储字节数组(Mutation Struct 中的值是 Text ...)

c++ - 对二进制文件的内容进行逆向工程?

c++ - Expand Variadic Template in Vardiadic Macro(如何从目标函数中提取参数名称)

c++ - 时序运算符+、运算符-、运算符*和运算符/

c++ - 在单独的行上编写函数体会产生负面结果吗?

c++ - 静态成员函数会增加类的开销吗?

c++ - 为什么不能将 "PURE"定义为const置0来标识纯虚类呢?

c++ - 如何确定更新图形驱动程序后缺少 OpenGL 入口点的原因

c++ - 如何在发行版本中包含声音片段

Eclipse Mars+MinGW 中的 C++ 调试器 "gdb.exe --version"错误