C ++ 11 — преобразование обратного вызова из C ++ в C ++ / CX

В коде я портирую у меня есть эта функция, которая принимает функцию в качестве аргумента:

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

Не могли бы вы рассказать мне, как реализовать эту функцию в C ++ / CX, как преобразовать std :: function в делегат C ++ / CX и как позже вызвать обратный вызов из C ++?

1

Решение

Ниже приведен пример кода, я не уверен, что это именно то, что вам нужно, но, возможно, вы найдете какой-то полезный код.

Вы можете использовать делегатов и события. Для преобразования вашей функции в делегирование вы можете использовать прокси-лямбду. В документации 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");
}
2

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


По вопросам рекламы [email protected]