我正在尝试学习一些Web程序集,并且所有调用都是异步的。我需要知道某个异步调用完成的时间。例如,函数emscripten_async_wget将2个回调(onLoad和onError)作为第二个参数和第三个参数。这两个回调具有相同的签名:
typedef void (*em_str_callback_func)(const char *);
我想更像是一个未来,才能知道它什么时候结束。
问题是我的模板代码有错误。我相信是因为lambda没有实例化有效的模板实例。
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 <(lambda at ./src/main.cpp:428:19)>的隐式实例化 std :: function m_onLoad;
./ src / main.cpp:439:25:注意:在实例化模板类'AsyncCall <(lambda at ./src/main.cpp:428:19),(lambda at ./src/main。 cpp:432:20)>'在这里请求 自动asyncCallObj = make_AsyncCall(onLoad,onError);
./ src / main.cpp:356:8:注意:模板在此处声明 struct callback_traits;