如何获取函数的唯一标识符

How to get an unique identifier of a function

我有一个接受自定义对象的函数 class。该对象的成员应存储该函数的标识符(或该函数的 'reference'),以便该函数可以确定之前是否使用该对象调用过它。

为此目的合适的标识符是什么?
我不一定是在说函数名,因为重载的函数共享相同的名称,所以这是行不通的。
功能地址(如代表所用)是正确的方法吗?我很确定这会起作用,但不是 100% 确定。或者函数可以像普通对象一样被垃圾收集器移动?
是否有另一种更好的方法来获得 'function 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;
}

目的是保存操作状态,稍后在调用的函数中继续操作。这在某些情况下是有意义的,例如该功能进行网络通信并且必须等待回复。 funcreturns 立即让线程可以做其他工作。稍后它回来获取回复。
我可以使用一个单独的线程,但我想在这里避免线程同步的开销,因为它不仅仅是 1 个添加。线程,但相当多。

@BenVoigt:感谢 MethodHandle 的提示!
这绝对是我需要的。我在 SO post '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;
}