c ++ cli — передать указатель неуправляемой функции-члена, который будет использоваться оболочкой для подключения его к сигналу в c ++ / cli

Я реализовал обработку событий с помощью Boost :: Signal и Boost :: Bind в моем управляемом файле C ++.
Ссылка на ссылку:Повысьте :: BIND

Также я создал указатель на функцию в моем родном файле C ++, который передается моему boost :: Signal.Connect () как EventHandler в управляемом коде.
Код для функции, который передается как указатель на функцию в моем родном C ++

std::string NativeCplus::AddFunctionPointer( std::string message )
{
return message;
}

и выше функция передается как boost :: function объект в другой функции NameChangeEvent (), как показано ниже:

void NativeCplus::NameChangeEvent()
{
UnmanagedNameEvent* unmanagedNameEvent=new UnmanagedNameEvent();
boost::function<std::string (std::string)> f;
f=std::bind1st(std::mem_fun(&AlgebraAPI::AddFunctionPointer),this);//FunctionPointer

std::string name="abcd";
unmanagedNameEvent->AddEvent(f,name);
}

В приведенном выше коде я взял boost :: function и указатель на функцию преобразуется в эту boost :: function (f). (Я ПРАВИЛЬНО СКАЗЫВАЮ ЭТО?). Затем строка unmanagedNameEvent-> AddEvent (f, name ) где повышение :: функции (F) передается AddEvent (F, имя) и это AddEvent (F, имя) реализован в моем управляемом файле кода C ++. Ниже приведен мой управляемый код C ++, который упоминается в собственном проекте c ++:

// В моем c ++ / CLI Wrapper.cpp

    declspec(dllexport) void UnmanagedNameEvent::AddEvent(boost::function<std::string (std::string)> f,std::string name)
{

UnmanagedNameEvent* unmanagedNameEvent=new UnmanagedNameEvent();
unmanagedNameEvent->signalEventMessage.connect(f);
//which should be like this.. unmanagedNameEvent->signalEventMessage.connect(bind(NativeCplus::f));

}

ПРОБЛЕМА: я не могу использовать класс NativeCplus для ссылки на его неуправляемую функцию (т.е. e.e.f), поскольку это создаст круглую зависимость файла dll. Любой обходной путь для этого? Все уши для любого более короткого решения !!

1

Решение

Вот пример того, что я понимаю, вы хотите:

Ваш C ++ / CLI «Обертка»:

Market.h:

#include <boost/function.hpp>
#include <boost/signals2.hpp>

class __declspec(dllexport) Market
{
private: boost::signals2::signal<void(double)> signalEvent;
public: void AddHandler(boost::function<void(double)> handler);
public: void Move(double value);
};

Market.cpp:

#include "Market.h"
#include <boost/function.hpp>

void Market::AddHandler(boost::function<void(double)> handler)
{
signalEvent.connect(handler);
}

void Market::Move(double value)
{
signalEvent(value);
}

И ваш родное приложение, test.cpp:

#include <iostream>

#include <boost/function.hpp>
#include <boost/bind.hpp>

#include "Market.h"
class Investor
{
public: void move_handler(double value)
{
std::cout << (value >= 0 ? "Hey! I'm the best!" : "Wat! I'm losing my shirt! ") << std::endl;
}
};

int main()
{
Investor investor;

Market market;

boost::function<void(double)> move = boost::bind(&Investor::move_handler, &investor, _1);

market.AddHandler(move);

market.Move(+0.10);
market.Move(-0.10);
}

Результаты:

Hey! I'm the best!
Wat! I'm losing my shirt!

Надеюсь это поможет…

1

Другие решения

Других решений пока нет …