Передать указатель неуправляемой функции-члена, который будет использоваться оболочкой для подключения к сигналу в C++/cli
Я реализовал обработку событий с помощью Boost::Signal и Boost::Bind в моем управляемом файле C++. Ссылка на ссылку: Boost:: 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) где boost:: function (f) передается в AddEvent (f, name), а этот AddEvent (f, name) реализован в моем файле управляемого кода 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 для ссылки на его неуправляемую функцию (ief), поскольку это создаст круглую зависимость файла 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!
Надеюсь это поможет...