Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我如何传递一个元素,以便能够在特定的专业化范围内进行评估?_C++_Templates_Metaprogramming_C++20_Chip 8 - Fatal编程技术网

C++ 我如何传递一个元素,以便能够在特定的专业化范围内进行评估?

C++ 我如何传递一个元素,以便能够在特定的专业化范围内进行评估?,c++,templates,metaprogramming,c++20,chip-8,C++,Templates,Metaprogramming,C++20,Chip 8,我正在尝试制作一个在编译时生成大部分指令的CHIP-8仿真器 我有一个constexpr数组,如下所示: constexpr uint16\u t hardCodedROM[]{ 0x8001、0x8002、0x8003、0xA0F0、0xB0FE }; 我对数组中的每一项都有专门化,如下所示: 模板结构操作码 { 静态内联无效任务(uint16_t代码) { printf(“未知操作码”); } }; 模板结构操作码 { 静态内联自动任务(uint16_t代码) { static cons

我正在尝试制作一个在编译时生成大部分指令的CHIP-8仿真器

我有一个constexpr数组,如下所示:

constexpr uint16\u t hardCodedROM[]{
0x8001、0x8002、0x8003、0xA0F0、0xB0FE
};
我对数组中的每一项都有专门化,如下所示:

模板结构操作码
{
静态内联无效任务(uint16_t代码)
{ 
printf(“未知操作码”);
}
};
模板结构操作码
{
静态内联自动任务(uint16_t代码)
{
static constexpr unsigned char submask=code&0x000F;//此处出错,代码不能用作常量
如果constexpr(子磁盘==0x0001)
{
printf(“操作码0x8xx1\n”);
}
如果constexpr(子掩码==0x0002)
{
printf(“操作码0x8x2\n”);
}
如果constexpr(子掩码==0x0003)
{
printf(“操作码0x8x2\n”);
}
如果constexpr(子掩码==0x0000)
{
printf(“操作码0x8xx0\n”);
}
}
};
模板结构操作码
{
静态内联自动任务(uint16_t代码)
{
printf(“操作码0xAxxx\n”);
}
};
模板结构操作码
{
静态内联自动任务(uint16_t代码)
{
printf(“操作码0xBxxx\n”);
}
};
我迭代每个元素并以这种方式调用专门化:

[&](std::index_序列)
{
(操作码::任务(hardCodedROM[p]),…);//我应该如何传递元素,以便能够根据每个子任务进行计算?
}
(std::make_index_sequence{});

我应该如何传递元素(hardCodedROM[p]),以便能够根据特定专业化中的每个子任务进行计算?

如果编译时总是知道
code
,请将其作为模板参数:

template<std::uint16_t code>
static void Task() {
    constexpr unsigned char submask = code & 0x000F;
    // ...
}
您还可以将
code
包装成类似于
Opcode
的类型,并将其作为函数参数传递,以避免使用非常难看的
模板
关键字。例如:

template<std::uint16_t> struct Instruction {};

// ...
    template<std::uint16_t code>
    static void Task(Instruction<code>) { 
        constexpr unsigned char submask = code & 0x000F;
        // ...
    }
// ...

[&]<std::size_t...p>(std::index_sequence<p...>) {
    (Opcode<(hardCodedROM[p] & 0xF000)>::Task(Instruction<hardCodedROM[p]>{}), ...);
}
(std::make_index_sequence<5>{});
模板结构指令{};
// ...
模板
静态无效任务(指令
){
constexpr unsigned char submask=code&0x000F;
// ...
}
// ...
[&](标准::索引_序列){
(操作码::任务(指令{}),…);
}
(std::make_index_sequence{});

code
将在运行时传递,是吗?从文件中读取的东西?这意味着它不能是编译时的值,所以不能对它或使用它计算的任何值执行编译时条件。@NicolBolas理论上,它们会在编译时通过std::make_index_sequence迭代中的折叠表达式传递ROM(或文件)是硬编码的,由
hardcodedROM[]
[&](std::index_sequence)
是C++20,而不是C++17。
template<std::uint16_t> struct Instruction {};

// ...
    template<std::uint16_t code>
    static void Task(Instruction<code>) { 
        constexpr unsigned char submask = code & 0x000F;
        // ...
    }
// ...

[&]<std::size_t...p>(std::index_sequence<p...>) {
    (Opcode<(hardCodedROM[p] & 0xF000)>::Task(Instruction<hardCodedROM[p]>{}), ...);
}
(std::make_index_sequence<5>{});