В коде я портирую у меня есть эта функция, которая принимает функцию в качестве аргумента:
void doSomething(std::function<void(std::string)> callback)
Не могли бы вы рассказать мне, как реализовать эту функцию в C ++ / CX, как преобразовать std :: function в делегат C ++ / CX и как позже вызвать обратный вызов из C ++?
Ниже приведен пример кода, я не уверен, что это именно то, что вам нужно, но, возможно, вы найдете какой-то полезный код.
Вы можете использовать делегатов и события. Для преобразования вашей функции в делегирование вы можете использовать прокси-лямбду. В документации 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");
}