#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 Честно говоря, я сам этого не пробовал, и у меня нет такого большого собственного опыта идеальной пересылки . Я внес обновление в ответ, который, надеюсь, решит вашу ошибку.