C+中的成员函数指针+;每人 我正在开发一个C++虚拟机,用于一个学校项目,它应该像DC命令一样工作,由输入输出元素、芯片组、CPU和RAM组成。我目前正在开发芯片组,在芯片组中我实现了一个小的解析类,以便能够从标准输入或文件中获取一些Asm指令,然后将这些指令推送到Cpu

C+中的成员函数指针+;每人 我正在开发一个C++虚拟机,用于一个学校项目,它应该像DC命令一样工作,由输入输出元素、芯片组、CPU和RAM组成。我目前正在开发芯片组,在芯片组中我实现了一个小的解析类,以便能够从标准输入或文件中获取一些Asm指令,然后将这些指令推送到Cpu,c++,foreach,member-functions,C++,Foreach,Member Functions,问题是:我的指令在std::list中排序,我希望能够使用foreach指令逐个推送它们。要做到这一点,我需要能够调用我的成员函数“push_指令”,作为for_的函数指针F;而我没能找到这样做的诀窍 有什么想法吗? 这是我的密码: /* ** Function which will supervise ** the lexing and parsing of the input (whether it's std_input or a file descriptor) ** the memor

问题是:我的指令在std::list中排序,我希望能够使用foreach指令逐个推送它们。要做到这一点,我需要能够调用我的成员函数“push_指令”,作为for_的函数指针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);
}

使用
boost::bind
as

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

您可以
bind1st
您的
指针来获取应用于cpu的函子:

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

(注意:我故意将下划线从
\u指令列表中删除。这是不允许的。)

当您记不起
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
,并存储对该对象的引用

然后我定义了一个
操作符()
,它接受您想要推送的指令,并调用
pushInstruction


for_each
循环中,我只需将
这个
传递给我的构造函数,创建一个函子实例,它被传递给
for_each
,然后为每个元素调用
操作符()

不幸的是,我们不允许使用Boost库,但谢谢,我会记住这个!bind也可以作为技术报告1的一部分(如std::tr1::bind)使用。不要在自己的标识符中使用下划线。下划线是为编译器/stl实现保留的。@xtofl:不仅仅是在该标识符后面保留下划线和大写字母的标识符?@ltjax:和命名空间范围中的前导下划线。和双下划线,前导或其他。一般来说,避免使用下划线更容易,而不是准确记录何时可以不使用下划线。这是允许的,只要它不在全局命名空间中。“每个…以下划线开头,后跟大写字母的名称保留给实现以供任何使用…每个以下划线开头的名称保留给实现以用作全局命名空间中的名称。”(17.4.3.1.2/1)@Erik:ouch。我的错。谢谢。不过我完全同意你的看法,只是不要从下划线开始,你也不必记住晦涩的下划线规则。无论如何,谢谢你们的回答:)似乎正是我所需要的,非常感谢!但我不确定我是否深刻理解这一点。简而言之:它告诉G++为我的成员函数(函数被视为对象)生成一个函子,并自动重写我的芯片组类的运算符()?mem_fun从函数指针创建一个函子,运算符()需要一个指向正确对象类型的指针作为第一个参数。bind1st然后创建一个函子,将传递的“this”绑定到第一个参数。因此,对于每个调用bind1st函子传递一个指令列表*,然后这个函子调用mem\u fun函子传递你的“this”,然后是指令列表*。我想这是一个非常优雅的解决方案,但我不能完全理解,我还没有使用“self”关键字…self不是一个关键字,它只是一个变量名。这个解决方案比IMO相当丑陋的bind*/mem_-fun结构漂亮得多。哦,好吧,我被Java/Php/Python“self”关键字误导了。为什么这是一个更好的解决方案?演出复杂性?优雅?@oleiade:
self
不是一个关键词,它只是一个变量名。我使用它正是因为它的Python含义。它表示当前对象,我们希望在其上调用
pushInstruction
,因此我觉得
self
是一个很好的描述性名称。但这一点都不神奇,我怀疑在表现上有什么不同。我更喜欢这个解决方案,因为它更容易记住。另一种选择是,我必须记住如何使用
bind1st
mem_fun
,以及成员指针的语法,因此出错的可能性很大。另一方面,函子是我一直在写的东西,绝对没有特殊的语法需要记住。只需定义一个类,该类的
operator()
调用成员函数。
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));