将C++回调函数转换为C++/CX

3

我正在移植的代码中有一个函数,该函数接受一个函数作为参数:

void doSomething(std::function<void(std::string)> callback)

请问如何在C++/CX中实现此函数,如何将std::function转换为C++/CX委托,并如何从C++中稍后调用回调函数?

1个回答

2
以下是示例代码,我不确定这是否正是您想要的内容 - 但也许您会发现一些有用的代码。
您可以使用委托和事件。要将函数转换为委托,您可以使用代理lambda。在msdn文档中有一些有用的示例:委托 (C++/CX)
public delegate void CallbackFunction(Platform::String^ arg);
public ref class MyCallbacks sealed {
public:
    event CallbackFunction^ callbackEvent;

    void doSomething(Platform::String^ arg) {
        callbackEvent(arg);
    }

internal:
    void doSomething(std::function<void(std::string)> callback) {
        CallbackFunction^ callbackPtr = ref new CallbackFunction(
            [=](Platform::String^ arg) {
            std::wstring tmp(arg->Data());
            std::string astr(tmp.begin(), tmp.end());//use wcstombs, MultiByteToWideChar, if such conversion is required
            callback(astr);
        });
        callbackEvent += callbackPtr;
    }
};

void test() {
    // On c++/cx side MyCallbacks initialization
    MyCallbacks^ cb = ref new MyCallbacks();

    // Here register callback functions to be raised later on
    cb->doSomething([](std::string s) {
        s.data();
    });

    // Raise callbacks from pure c++ inside c++/cx using delegetes and event
    cb->doSomething(L"DoSomething");
}

谢谢您的回复! 是否可以从纯C ++设置回调函数? 我想从纯C ++ 运行C++ / CX WinRT组件,将回调作为参数传递。 一旦用户与购买交互,回调将从WinRT C++ / CX中调用。 - Siegfried
1
应该是可能的,我从未尝试过,但我会从WRL开始:这里是一个链接,可以帮助你入门https://msdn.microsoft.com/en-us/library/hh973459.aspx -“如何使用WRL激活和使用Windows运行时组件”。也许有一种更简单的方法,您可以从winrt应用程序中调用纯c ++库中的函数,在这样的函数中返回您的回调。 - marcinj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接