2016-04-05 9 views
1

私はカスタムクラスのオブジェクトをとる関数を持っています。このオブジェクトのメンバーは、その関数の識別子(またはその関数への '参照')を格納して、関数がこのオブジェクトで前に呼び出されたかどうかを判断できるようにする必要があります。関数の一意の識別子を取得する方法

この目的に適した識別子は何ですか?
オーバーロードされた関数が同じ名前を共有するので、関数名については必ずしも言及していないので、これは機能しません。
ファンクションアドレス(代理人用)は適切な方法ですか?私はこれがうまくいくと確信していますが、100%確実ではありません。または、関数を通常のオブジェクトのようなガベージコレクタによって移動することができますか?
「機能ID」を取得する別の方法がありますか?

編集
ここで(擬似コードを使用)私の要件を実証する例を示します

void WorkerFunction (CFuncStep i_oFS) 
{ 
    if (i_oFS.FunctionID == WorkerFunction.FunctionID) 
    { 
    // continue work 
    } 
    else 
    { 
    // start work 
    i_oFS.FunctionID = WorkerFunction.FunctionID; 
    } 

    if (finished_work) 
    i_oFS.FunctionID = null; 
} 

目的は、動作状態を保存し、後で呼び出す関数内で運転を続けています。例えば、この機能はネットワーク通信を行い、応答を待たなければなりません。 funcはすぐに戻り、スレッドは他の作業を行うことができます。その後、返信を取得するために戻ってきます。
私は別のスレッドを使うことができましたが、ここでスレッド同期のオーバーヘッドを避けたいのは、1つのスレッドだけではないからです。スレッド、しかしかなりの。

+0

それがこれを行うための最善の方法を言うのは難しいですが、ほとんどの状況では、私はないと示唆していますクラスのメンバがこのように関数の他の知識を持つことを可能にする。どのような目的のために、関数は以前にこのオブジェクトに対して呼び出されたかどうかを知る必要がありますか? –

+0

オラクルを探しているのはむしろ悪い考えです。代わりに列挙型を使用してください。 –

+0

MethodHandleが要件を満たしている必要があります –

答えて

0

@BenVoigt:ヒントをお寄せいただきありがとうございますMethodHandle
これは絶対に必要なものです。私はSOのポスト「Can you use reflection to find the name of the currently executing method?

での使用例を見つけたここに私のソリューションです:いくつかのより多くのコンテキストなし

using namespace System::Reflection; 

ref class CFuncStep 
{ 
public: 
    int    m_iStep; 
    MethodBase^  m_oMethod; 
    String^   m_sName; 
}; 

void workerfunction (CFuncStep^ i_oFS) 
{ 
    MethodBase^ oMethod = MethodBase::GetCurrentMethod(); 

    if (oMethod != i_oFS->m_oMethod) 
    { 
    i_oFS->m_iStep = 1; 
    i_oFS->m_oMethod = MethodBase::GetCurrentMethod(); 
    i_oFS->m_sName = i_oFS->m_oMethod->Name; 
    } 

    switch (i_oFS->m_iStep) 
    { 
    case 1: 
    case 2: 
    case 3: 
    i_oFS->m_iStep++; 
    break; 

    case 4: 
    i_oFS->m_iStep = 0; 
    i_oFS->m_oMethod = nullptr; 
    i_oFS->m_sName = nullptr; 
    } 
}; 

int main() 
{ 
    CFuncStep^ oFS = gcnew CFuncStep; 
    do 
    { 
    workerfunction (oFS); 
    } 
    while (oFS->m_iStep > 0); 

    return 0; 
} 
関連する問題