Создать делегат через шаблонную функцию - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь уменьшить некоторый шаблонный код и включить в процесс следующий процесс:

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

...