std :: bind с переменными аргументами функции, включая функцию обратного вызова с переменными аргументами - PullRequest
0 голосов
/ 12 марта 2019

Если у меня есть функция с переменными аргументами, один из которых является функцией обратного вызова, как будет работать функция связывания для этой функции?Текущая реализация, как показано ниже:

template <typename... Args>
bool CallWithArgs(std::function<void (String&, Args... args)> cbk, Args... args) 
{ .... }

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

bool value = true;
auto f1 = std::bind(&CallWithArgs, rawPtr, _1, _2);
std::future<bool> fut = std::async(f1, cbk, value);
fut.wait();

Есть ли в любом случае представление переменных параметров в заполнителях std:: функция связывания?Проблемы с компиляцией в настоящей реализации.

note: template<class _Func, class ... _BoundArgs> typename std::_Bind_helper<std::__or_<std::is_integral<typename std::decay<_Tp>::type>, std::is_enum<typename std::decay<_Tp>::type> >::value, _Func, _BoundArgs ...>::type std::bind(_Func&&, _BoundArgs&& ...)
     bind(_Func&& __f, _BoundArgs&&... __args)

note:   template argument deduction/substitution failed:
note:   couldn't deduce template parameter ‘_Func’

1 Ответ

1 голос
/ 12 марта 2019

Поскольку вы не можете использовать общие лямбды в 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...