如何获取函数的唯一标识符
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;
}
我有一个接受自定义对象的函数 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;
}