0

マルチスレッドスキームのラッパーを書いています。タイマーと同じように動作するはずです。

コンストラクターに渡される必要があるclockという関数を実装する特定のクラス( )があります。tickC ++スタイルの関数(Cの規則ではなくmyClass :: myfunction)をメソッドまたはコンストラクターのパラメーターとして説明するにはどうすればよいですか?

この種のコンストラクターの宣言を見せてくれる人はいますか?

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。2 つのポインターが必要です。1 つはクラス オブジェクトで、もう 1 つはそのクラスのメソッドです。簡単に言えば、次のことができるようにする必要があります。

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 に答える