Это две основные проблемы в коде:
(1) std::async
уничтожить все переданные аргументы перед их передачей в предоставленную функцию, это означает, что параметр ссылок в checkRules
отличается от типа async
, который пытается использовать при вызове функции, вам нужно сделать следующее изменение:
template< typename Fn, typename ...Args >
bool checkBlock( std::reference_wrapper<bool> const& toCheck,
Fn&& fn, Args&& ... args )
{
int startIndx = 0;
int endIndx = 10;
std::future< bool > tk(std::async(std::launch::async,
std::forward<Fn>(fn),
startIndx, endIndx,
toCheck,
std::forward<Args>(args) ... ) );
return tk.get();
}
(2) Вы передаете this
в качестве аргумента checkBlock
, который в итоге заканчивается аргументом checkRules
(при асинхронном вызове), но функция-член не принимает TestChild*
для сопоставления this
. Поскольку вы используете указатель на функцию-член на async
, вам необходимо использовать std::bind
для привязки this
аргументов и использовать std::wrap
для аргументов, которые вы хотите изменить:
#include <functional>
using namespace std::placeholders;
bool TestChild::check()
{
bool toCheck;
std::vector< bool > results;
return checkBlock( std::ref(toCheck), std::bind(&TestChild::checkRules, this, _1, _2, _3, _4), std::ref(results));
}