Поскольку вы не можете использовать общие лямбды в C ++ 14, вы можете создать свою собственную, сделав функтор.Если у вас есть
struct CallWithArgsFunctor
{
pointer_type pointer_to_call_on;
CallWithArgsFunctor(pointer_type pointer_to_call_on) : pointer_to_call_on(pointer_to_call_on) {}
template<typename... Args>
auto operator()(Args&&... args) -> decltype(CallWithArgs(pointer_to_call_on, std::forward<Args>(args)...))
{
return CallWithArgs(pointer_to_call_on, std::forward<Args>(args)...)
}
};
, то вы можете использовать его в своем блоке кода, например
bool value = true;
std::future<bool> fut = std::async(CallWithArgsFunctor{rawPtr}, cbk, value);
fut.wait();
. Это позволяет разрешению перегрузки работать в теле оператора вызова вместо того, чтобы выполнять приведениеуказатель на тип, который вы хотите вызвать.
Если вы сможете перейти на C ++ 14, ваш код просто станет
bool value = true;
auto f1 = [=](auto&&... args){ return CallWithArgs(rawPtr, std::forward<decltype(args)>(args)...); };
std::future<bool> fut = std::async(f1, cbk, value);
fut.wait();