Я пытаюсь изучить некоторые веб-сборки, и все вызовы асинхронны.Мне нужно знать, когда асинхронный вызов закончен.Например, функция emscripten_async_wget принимает 2 обратных вызова (onLoad и onError) в качестве второго и третьего аргумента.Оба обратных вызова имеют одинаковую подпись: typedef void (*em_str_callback_func)(const char *);
Я хотел бы передать больше, как будущее, чтобы знать, когда оно закончится.
Проблема в том, что у меня есть ошибка в моем коде шаблона.Я считаю, что это потому, что лямбда не создает действительный экземпляр шаблона.
template <typename Callback_t>
struct callback_traits;
template <typename Object_t, typename Return_t, typename... Arg_t>
struct callback_traits<Return_t (Object_t::*)(Arg_t...)> : public callback_traits<Return_t(Arg_t...)>
{
using ObjectType = Object_t;
};
template <typename Return_t, typename... Arg_t>
struct callback_traits<Return_t (*)(Arg_t...)> : public callback_traits<Return_t(Arg_t...)>
{
};
template <typename Return_t, typename... Arg_t>
struct callback_traits<Return_t(Arg_t...)>
{
using ReturnType = Return_t;
using SignatureType = Return_t(Arg_t...);
using PtrType = Return_t (*)(Arg_t...);
};
template <typename Return_t, typename... Arg_t>
struct callback_traits<std::function<Return_t(Arg_t...)>>
{
using ReturnType = Return_t;
using SignatureType = Return_t(Arg_t...);
using PtrType = Return_t (*)(Arg_t...);
};
template <typename OnLoad_t, typename OnError_t>
class AsyncCall
{
using OnLoadTraits = callback_traits<OnLoad_t>;
using OnErrorTraits = callback_traits<OnError_t>;
public:
AsyncCall(OnLoad_t onLoad, OnError_t onError)
{
m_future = m_promise.get_future();
m_onLoad = [onLoad, &promise = m_promise](auto... args) {
onLoad(std::forward<decltype(args)>(args)...);
promise.set_value();
};
}
void wait()
{
m_future.get();
}
private:
std::promise<void> m_promise;
std::future<void> m_future;
std::function<typename OnLoadTraits::SignatureType> m_onLoad;
};
template <typename OnLoad_t, typename OnError_t>
AsyncCall<OnLoad_t, OnError_t> make_AsyncCall(OnLoad_t onLoad, OnError_t onError)
{
return AsyncCall<OnLoad_t, OnError_t>(std::forward<OnLoad_t>(onLoad), std::forward<OnError_t>(onError));
}
auto asyncCallObj = make_AsyncCall(onLoad, onError);
Я пытаюсь выяснить, какая специализация шаблона мне не хватает.Я получаю сообщение об ошибке:
. / Src / main.cpp: 410: 26: ошибка: неявное создание неопределенного шаблона callback_traits <(лямбда в ./src/main.cpp:428: 19)> 'std :: function m_onLoad;
. / Src / main.cpp: 439: 25: note: при создании шаблона класса' AsyncCall <(лямбда в ./src/main.cpp:428: 19), (лямбда в ./src/main.cpp:432:20)> 'здесь запрошено auto asyncCallObj = make_AsyncCall (onLoad, onError);
. / Src / main.cpp: 356:8: примечание: здесь объявлен шаблон struct callback_traits;