我有一个函数,它接受一个自定义类的对象。此对象的成员应存储该函数的标识符(或该函数的“引用”),以便该函数可以确定之前是否使用此对象调用它。
为此目的,什么是合适的身份? 我不一定在谈论函数名称,因为重载的函数共享相同的名称,所以这不起作用 功能地址(用于委托代理)是否正确?我很确定这会有效,但不是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)
@BenVoigt:感谢MethodHandle
的提示!
这绝对是我需要的。我在SO帖子&{39; 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;
}