0

我需要一点帮助。我需要以特定的方式完善一个元组。想象一下

template <typename F, typename... Args>
auto package_task(F&& func, Args&&... args) -> std::function<void()>
{
    //for the purposes of this example imagine capture to be std::move and
    //to be inplace in the lambdas' capture.
    auto callable = capture(std::forward<F>(func));
    auto params = capture(std::make_tuple(std::forward<Args>(args)...));

    return [callable , params]() mutable { std::apply(callable, params); };
}

打包的任务稍后将在不同的线程上执行,但是当我调用 apply 时,我需要“可调用”来让它的参数从元组扩展并转发,就像它们在package_task函数中传递的一样。我不能使用forward_as_tuple,因为我正在复制/移动参数和稍后执行的可调用对象。我需要类似的东西

template <typename F, typename... Args>
auto package_task(F&& func, Args&&... args) -> std::function<void()>
{
    //for the purposes of this example image capture to be std::move and
    //to be inplace in the lambdas' capture.
    auto callable = capture(std::forward<F>(func));
    auto params = capture(std::make_tuple(std::forward<Args>(args)...));

    return [callable , params]() mutable { std::apply_but_expand_as<Args&&…&gt;(callable, params); };
}

任何想法,将不胜感激。

4

1 回答 1

2

如果您试图制作一个一次性可调用来转发其参数,那么您可以使用 C++17 或更早版本做的最好的事情是:

template <typename F, typename... Args>
auto package_task(F&& func, Args&&... args) -> std::function<void()>
{
    return [func = std::forward<F>(func),
            args_tuple = std::make_tuple(std::forward<Args>(args)...)]
           () mutable
    {
        return std::apply([](auto&&... args){
            return std::invoke(
                std::forward<F>(func),
                std::forward<Args>(args)...
                );
        }, args_tuple);
    };
}

也就是说,你forward进入Args一个元组,apply这个元组然后forward他们退出。


在 C++20 中,感谢P0780,这可以简化为:

template <typename F, typename... Args>
auto package_task(F&& func, Args&&... args) -> std::function<void()>
{
    return [func = std::forward<F>(func),
            ...args = std::forward<Args>(args)] () mutable
    {
        return std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
    };
}
于 2018-09-25T19:25:12.970 回答