通过模板函数创建委托

时间:2018-09-18 05:30:56

标签: c++ .net c++-cli clr

我正在尝试减少一些样板代码并将以下过程引入函数:

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())

0 个答案:

没有答案