在c++中传递函数作为参数

Passing a function as an argument in c++

本文关键字:参数 传递函数 c++      更新时间:2023-10-16

我有以下调用:

void Derived::GetEntry(Skill&);
InorderTraverse(GetEntry);

称为

void Base<ItemType>::InorderTraverse(void Visit(ItemType&)) const

尝试按写入方式编译会生成

错误C3867:"Derived::GetEntry":函数调用缺少参数列表;使用'&派生::GetEntry'以创建指向成员的指针

使用&派生::GetEntry生成

无法将参数1从"void(__thiscall Derived::*)(Skill&)"转换为"void(___cdecl*)(ItemType&)"

正在将声明更改为静态void GetEntry。。。修复了这些问题,但产生了一组新的问题(即我不能访问非静态对象(非静态成员引用必须相对于特定对象)

我有一个类似的遍历操作,它可以很好地使用静态声明,因为被调用的函数只显示关于它被调用的每个对象的信息。

我已经找了好几天的答案了,我觉得这很简单。有没有办法在另一个函数调用中使用非静态函数作为参数?

完整的代码是:https://github.com/mindaika/SkillTree

编辑:插入完整的工作示例。

我建议您使用std函数指针。

例如:

#include <functional>
void main()
{
class TheClass
{
public:
   TheClass()
   {
       m_function = ( std::tr1::bind(&TheClass::run, this) );
   };
   void run()
   {
          // stuff to do
   };
   std::tr1::function<void ()> m_function;
};
TheClass theclass;
theclass.m_function();
}

m_function();//调用函数

正如我在问题中提到的,我试图绕过由使用静态变量引起的"内存泄漏"(这实际上不是泄漏,因为静态会被破坏,但直到泄漏检测器运行之后才会发生)。我最终使用了这里描述的封装指针的修改:C++释放静态变量