在C ++

时间:2015-09-17 16:15:08

标签: c++ lambda function-pointers

我正在尝试创建一个简单的CPU模拟器。

CPU类有一个hash_map<uint8_t, Instruction> instructionTable;,在CPU构造函数中,我想创建所有Instruction个对象,并将它们插入instructionTable。< / p>

Instruction.h:

#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

CPU.h:

#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

CPU.cpp:

#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表达式/匿名函数用于此类事情。

2 个答案:

答案 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)

  1. 这一行:

    void *(execute)(CPU* cpu);
    

    函数声明。要声明函数指针,请使用

    void (*execute)(CPU* cpu);
    
  2.   

    无法从void转换为void (__cdecl *)(void)

    这是因为你调用了你的lambda,它的返回表达式不存在,即等于void。删除最后一个括号:

    LDA->execute = []() { cout << "execute LDA..."; };
    
  3. 另请注意a lambda can only be converted to a function pointer if it does not capture

    更喜欢使用std::function而不是原始函数指针。