Передайте указатель неуправляемой функции-члена, который будет использоваться оболочкой для подключения к сигналу в 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). (ПРАВИЛЬНО ЛИ Я СКАЗАЛ ЭТО?). ), где boost::function(f) передается в AddEvent(f,name), и это AddEvent(f,name) реализуется в мой управляемый файл кода 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 для ссылки на его неуправляемую функцию (т.е. f), так как это создаст круговую зависимость файла dll. Любое обходное решение для этого? Все уши для любого более короткого решения!


person SkoolBoyAtWork    schedule 22.06.2013    source источник
comment
Вы можете использовать boost::bind вместо std::bind1st и std::mem_fun.   -  person petersohn    schedule 22.06.2013
comment
Я использовал это @petersohn. Могу ли я получить ваш синтаксис привязки boost? И все же решит ли это основную проблему, с которой я сталкиваюсь?   -  person SkoolBoyAtWork    schedule 22.06.2013


Ответы (1)


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

Ваша оболочка C++/CLI:

Маркет.ч:

#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!

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

person Pragmateek    schedule 22.06.2013