我正在编写多线程方案的包装器。它应该与计时器类似。
我有一个特定的类(clock
),它实现了一个名为tick
的函数,该函数应该传递给构造函数。如何将C ++样式函数(myClass :: myfunction,而不是C约定)描述为方法或构造函数的参数?
有人愿意向我展示这种构造函数的声明吗?
clock myInstance(otherClass::aMethod)
myInstance.tick(); // Should call otherClass::aMethod
myInstance.tick();
C ++ 11和Bind有帮助吗?
答案 0 :(得分: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
}
答案 1 :(得分: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();
}