gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:27:08 25 4
gpt4 key购买 nike

我有以下代码片段:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com