我正在尝试减少一些样板代码并将以下过程引入函数:
auto iInitialize = dynamic_cast<ISensorInitialize^>(sensorPlugin.instance);
if (iInitialize)
{
sensorPlugin.initializeDelegate = gcnew SensorPlugin::InitializeDelegate(iInitialize, &ISensorInitialize::Initialize);
sensorPlugin->initialize = (SensorPluginInitializeFn*) (void*) Marshal::GetFunctionPointerForDelegate(sensorPlugin.initializeDelegate);
}
当然,这有点令人费解。我从一个对象开始,将其强制转换为某种接口类型,如果它实现了该接口,那么我将创建一个接口方法的委托,然后得到一个可以传递给普通C ++的函数指针。
我在几个不同的界面上做了很多次,所以我懒惰的程序员开始研究并决定将其全部移到一个函数中。我可以几乎开始工作,但棘手的部分是创建委托。我找不到任何方法可以将接口成员的类型传递给函数以进行实例化。这就是我所拥有的:
template<typename TInterface, typename TMethod, typename TPlugin, typename TDelegate>
IntPtr
GetPluginFunctionPointer(TPlugin instance, TDelegate^% delegate, TFnPointer& fnPointer)
{
TInterface^ interface = dynamic_cast<TInterface^>(instance);
if (interface)
{
delegate = gcnew TDelegate(interface, &TMethod);
return Marshal::GetFunctionPointerForDelegate(delegate);
}
return IntPtr::Zero;
}
// Usage
GetPluginFunctionPointer<ISensorInitialize, ISensorInitialize::Initialize>(sensorPlugin.instance, sensorPlugin.initializeDelegate);
问题出在TMethod。是否有一些方法可以将ISensorInitialize :: Initialize()的类型传递给模板函数而无需借助ISensorInitialize^ x; decltype(x->Initialize())
?