我正在为一个学校项目开发一个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);
}
答案 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
中删除了下划线。这是不允许的。)