我正在尝试从接受 Callable 类型的模板函数创建一个承诺。但我不知道该怎么做。我尝试使用std::invoke_result_t
,但这需要参数来知道结果类型,这是我在构造 promise 时不知道的。
有什么方法可以推断出返回类型?我想在泛型 lambda 的情况下这可能是不可能的,但是对非泛型 lambda 情况有什么作用吗?
template <typename Callable, typename Promise>
class Job {
public:
Job(Callable&& c, Promise&& p)
: callable(std::move(c))
, promise(std::move(p))
{}
auto getFuture() {
return /* a std::shared_future */;
}
template<typename... Args>
void call(Args&&... args) {
promise.set_value(std::invoke(callable, args...));
}
private:
Callable callable;
Promise promise;
};
template<typename Callable>
decltype(auto) makeJob(Callable&& c) {
std::promise</* some type */> promise = /* something */;
return Job(std::forward<Callable>(c), std::move(promise));
}
int main() {
f1 = [](int arg){return arg;};
auto job = makeJob(std::move(f1));
auto future = job.getFuture();
job.call(1);
std::cout << future.get() << '\n';
}