我正在尝试创建一个简单的CPU模拟器。
CPU
类有一个hash_map<uint8_t, Instruction> instructionTable;
,在CPU
构造函数中,我想创建所有Instruction
个对象,并将它们插入instructionTable
。< / p>
#ifndef INSTRUCTION_H
#define INSTRUCTION_H
#include <cstdint>
#include <string>
#include "CPU.h"
class Instruction
{
public:
uint8_t opcode;
Instruction();
void(*execute)(CPU* cpu);
};
#endif
#ifndef CPU_H
#define CPU_H
#include <cstdint>
#include <unordered_map>
#include "Instruction.h"
#include "Memory.h"
class CPU
{
public:
Memory* memory;
CPU(Memory* memory);
void loadInstructionSet();
};
#endif
#include "stdafx.h"
#include "CPU.h"
#include <string>
#include <iostream>
CPU::CPU(Memory* memory){
this->memory = memory;
}
void CPU::loadInstructionSet(){
Instruction *LDA = new Instruction();
LDA->execute = [](CPU*) { std::cout << "execute LDA..."; };
}
我现在如何创建Instruction
个对象并分配新的执行功能?
我认为lambda表达式/匿名函数用于此类事情。
答案 0 :(得分:3)
LDA-&gt; execute = {cout&lt;&lt; &#34;执行LDA ...&#34 ;; }();
这应该是
LDA->execute = [](CPU*) { cout << "execute LDA..."; };
首先,使用行末尾的括号,您在创建lambda后立即实际调用lambda。
其次,execute
的类型定义表示该函数需要指向CPU
的指针,但在lambda中,您按值CPU
而不是指针。
答案 1 :(得分:3)
这一行:
void *(execute)(CPU* cpu);
是函数声明。要声明函数指针,请使用
void (*execute)(CPU* cpu);
无法从
void
转换为void (__cdecl *)(void)
这是因为你调用了你的lambda,它的返回表达式不存在,即等于void。删除最后一个括号:
LDA->execute = []() { cout << "execute LDA..."; };
另请注意a lambda can only be converted to a function pointer if it does not capture。
更喜欢使用std::function
而不是原始函数指针。