Передать функцию с аргументами и вернуть значение другой функции

#c

#c

Вопрос:

Возможно ли передать функцию с такими аргументами:

 int func(int num)
{
 return num;
}
  

к этой функции:

         template<class T>
        auto addTask(T task) -> std::future<decltype(task())>
        {
            auto wrapper = std::make_shared<std::packaged_task<decltype(task()) ()>>(std::move(task));
            {
                std::unique_lock<std::mutex> lock(mEventMutex);
                mTasks.emplace([=] {
                    (*wrapper)();
                });
            }
            mEventVar.notify_one();
            return wrapper->get_future();            
        }
  

Я знаю, как передать функцию без agr, как это:

 void func()
{}
  

Это будет просто:

 addTask(func);
  

но не могу найти, где разместить аргументы. Возможно ли это?

Ответ №1:

Вы могли бы использовать лямбда-выражение, вызывающее функцию:

 addTask([some_value]()
{
    func(some_value);
});
  

Или переписать addTask , чтобы использовать пакеты параметров шаблона для возможных аргументов:

 template<typename Func, typename ...Args>
auto addTask(Func task, Args... arguments) -> std::future<decltype(task(arguments...))>
{
    auto wrapper = std::make_shared<std::packaged_task<decltype(task(arguments...)) (Args...)>>(std::move(task));
    {
        std::unique_lock<std::mutex> lock(mEventMutex);
        mTasks.emplace([=] {
            (*wrapper)(std::forward<Args>(arguments)...);
        });
    }
    mEventVar.notify_one();
    return wrapper->get_future();         
}

addTask(func, some_value);
  

Комментарии:

1. Отличный ответ, но когда я его компилирую, у меня возникает ошибка: error: no matching function for call to ‘forward(const intamp;)’ . Я также пробовал (*wrapper)(std::forward<Args>(arguments)...); , но все еще имел ошибку: binding reference of type ‘std::remove_reference<int>::typeamp;’ {aka ‘intamp;’} to ‘const int’ discards qualifiers . Где может быть проблема?

2. @ADV Честно говоря, я сам этого не пробовал, и у меня нет такого большого собственного опыта идеальной пересылки . Я внес обновление в ответ, который, надеюсь, решит вашу ошибку.