0

我正在为多线程方案编写一个包装器。它应该像计时器一样运行。

我有一个特定的类 ( clock),它实现了一个调用的函数,该函数tick应该传递给构造函数。如何将 C++ 风格的函数(myClass::myfunction,与 C 约定相对)描述为方法或构造函数的参数?

有人愿意向我展示这种构造函数的声明吗?

clock myInstance(otherClass::aMethod)
myInstance.tick(); // Should call otherClass::aMethod
myInstance.tick();

C++11 和 Bind 有帮助吗?

4

2 回答 2

5

您可以调用类的静态成员函数或对象的非静态成员函数。非静态成员函数需要具有对象(this指针)的上下文。

这是一个简化示例,说明如何使用仿函数和绑定来调用成员函数。

#include <functional>

class clock
{
public:
   clock(const std::function<void()>& tocall) : m_tocall(tocall) {}
   void tick() {m_tocall();}

private:
   std::function<void()> m_tocall;
};

class otherclass
{
public:
   void aMethod() {}
};

int main(int argc, char *argv[])
{
   otherclass A;
   clock c( std::bind(&otherclass::aMethod, &A) );

   c.tick(); // Will end up calling aMethod() of object A
}
于 2013-01-20T06:24:06.613 回答
1

你不需要为此使用std::function。您需要有两个指针:一个是类对象,一个是该类的方法。简单来说,你需要让它能够做到:

CallNonVirtual(pClassPtr, pFuncAddr);

因此,您需要这两个参数,以便您实际上可以这样称呼它:

(pClassPtr->*pFuncAddr)(); // Assuming no parameter

为此,您可以执行以下操作:

class Clock
{
    COtherClass* pClassPtr; 

    /// Typedef simplifies
    typedef void (COtherClass::*TargetFuncType)();
    TargetFuncType pFuncAddr;

public:
    Clock(COtherClass* pOther, TargetFuncType pFunc) : 
          pClassPtr(pOther), pFuncAddr(pFunc) 
   { 
   }

   void tick()
   {
       (pClassPtr->*pFuncAddr)();
   }
 };      

并拨打电话:

int main()
{
   COtherClass Obj;
   Clock theClock(&Obj, &COtherClass::TheNonStatic);

   theClock.tick();
}
于 2013-01-20T07:11:11.253 回答