C ++ for_each中的成员函数指针

时间:2011-02-19 11:22:09

标签: c++ foreach member-functions

我正在为一个学校项目开发一个C ++的小型虚拟机,它应该像dc命令一样工作,并且由一个输出输出元素,一个芯片组,一个Cpu和Ram组成。我目前正在研究芯片组,我已经实现了一个小的解析类,以便能够从标准输入或文件中获取一些Asm指令,然后将此指令推送到Cpu。

问题是:我的指令在std :: list中排序,我希望能够通过foreach指令逐个推送它们。为此,我需要能够将我的成员函数“push_instruction”称为for_each的函数指针F;我无法找到这样做的伎俩...

有什么想法吗? 这是我的代码:

/*
** Function which will supervise
** the lexing and parsing of the input (whether it's std_input or a file descriptor)
** the memory pushing of operands and operators
** and will command the execution of instructions to the Cpu
*/
void                    Chipset::startExecution()
{
    /*
    ** My parsing 
    ** Instructions
    **
    */

    for_each(this->_instructList.begin(), this->_instructList.end(), this->pushInstruction);
}


void                    Chipset::pushInstruction(instructionList* instruction)
{
    if (instruction->opCode == PUSH)
      this->_processor->pushOperand(instruction->value, Memory::OPERAND, Memory::BACK);
    else if (instruction->opCode == ASSERT)
      this->_processor->pushOperand(instruction->value, Memory::ASSERT, Memory::BACK);
    else
      this->_processor->pushOperation(instruction->opCode);
}

4 个答案:

答案 0 :(得分:11)

std::for_each(
    _instructList.begin(), 
    _instructList.end(), 
    std::bind1st(std::mem_fun(&Chipset::pushInstruction), this));

答案 1 :(得分:3)

如果你不记得std::bind函数的语法,有时候编写一个只转发给成员函数的仿函数会更容易:

struct PushInstruction {
  PushInstruction(Chipset& self) : self(self) {} 

  void operator()(instructionList* instruction) {
    self.pushInstruction(instruction);
  }    

  Chipset& self;    
};

std::for_each(_instructList.begin(), _instructList.end(), PushInstruction(*this));

一点解释:

我定义了一个类,它在构造函数中接受我们想要调用pushInstruction的对象,并存储对象的引用。

然后我定义一个operator() hich接受你想要推送的指令,然后调用pushInstruction

for_each循环中,我只是将this传递给我的构造函数,创建了一个仿函数实例,然后传递给for_each,然后调用operator()它适用于每个元素。

答案 2 :(得分:2)

使用boost::bind

std::for_each(/*..*/, /*..*/,
            boost::bind(&Chipset::pushInstruction, this, _1));

答案 3 :(得分:2)

您可以bind1st使用this指针获取应用于cpu的仿函数:

std::foreach( instructList.begin(), instructList.end(),
      std::bind1st
          ( std::mem_fun( &CChipSet::pushInstruction )
          , this 
          )
      );

(注意:我故意从_instructionList中删除了下划线。这是不允许的。)