我正在尝试制作一个在编译时生成大部分指令的 CHIP-8 仿真器。
所以我有一个像这样的 constexpr 数组:
constexpr uint16_t hardCodedROM[] = {
0x8001, 0x8002, 0x8003, 0xA0F0, 0xB0FE
};
而且我对数组的每个项目都有一个专业化,如下所示:
template<uint16_t instruction> struct Opcode
{
static inline void Task(uint16_t code)
{
printf("Unknown Opcode \n");
}
};
template<> struct Opcode<0x8000>
{
static inline auto Task(uint16_t code)
{
static constexpr unsigned char submask = code & 0x000F; //error here, code can not use as a constant
if constexpr (submask == 0x0001)
{
printf("Opcode 0x8xx1 \n");
}
if constexpr (submask == 0x0002)
{
printf("Opcode 0x8xx2 \n");
}
if constexpr (submask == 0x0003)
{
printf("Opcode 0x8xx2 \n");
}
if constexpr (submask == 0x0000)
{
printf("Opcode 0x8xx0 \n");
}
}
};
template<> struct Opcode<0xA000>
{
static inline auto Task(uint16_t code)
{
printf("Opcode 0xAxxx \n");
}
};
template<> struct Opcode<0xB000>
{
static inline auto Task(uint16_t code)
{
printf("Opcode 0xBxxx \n");
}
};
我遍历每个元素并以这种方式调用专业化:
[&] <std::size_t...p>(std::index_sequence<p...>)
{
(Opcode<(hardCodedROM[p] & 0xF000)>::Task(hardCodedROM[p]), ...); //How should i pass the element, to be able to evaluate depending on each submask?
}
(std::make_index_sequence<5>{});
我应该如何传递元素(hardCodedROM[p]),以便能够根据特定专业中的每个子掩码进行评估?