Сохранение результата привязки с заполнителями в std::function

Я читал, как выполнить std::bind для обычной функции. И сохраните бесплатную функцию или функцию-член в std::function. Однако, если я попытаюсь использовать заполнитель для одного аргумента и фактическое значение для другого аргумента; Я не могу сделать вызов (вызывает ошибку компиляции) в std::function

Итак, я попробовал следующий код:

#include <random>
#include <iostream>
#include <memory>
#include <functional> 

int g(int n1, int n2)
{
    return n1+n2;
}


int main()
{
    using namespace std::placeholders;  // for _1, _2, _3...

    std::function<int(int,int)> f3 = std::bind(&g, std::placeholders::_1, 4);
    std::cout << f3(1) << '\n';

//this works just fine
    auto f4 = std::bind(&g, std::placeholders::_1, 4);
    std::cout << f4(1) << '\n';
}

Я получаю следующую ошибку g++ 4.7

prog.cpp: In function 'int main()':
prog.cpp:17:22: error: no match for call to '(std::function<int(int, int)>)         (int)'
     std::cout << f3(1) << '\n';
                  ^
In file included from /usr/include/c++/4.9/memory:79:0,
                 from prog.cpp:3:
/usr/include/c++/4.9/functional:2142:11: note: candidate is:
     class function<_Res(_ArgTypes...)>
       ^
/usr/include/c++/4.9/functional:2434:5: note: _Res         std::function<_Res(_ArgTypes ...)>::operator()(_ArgTypes ...) const [with _Res =         int; _ArgTypes = {int, int}]
     function<_Res(_ArgTypes...)>::
     ^
/usr/include/c++/4.9/functional:2434:5: note:   candidate expects 2 arguments, 1 provided

person thassan    schedule 30.01.2015    source источник
comment
std::function‹int(int)›   -  person bolov    schedule 30.01.2015
comment
note: candidate expects 2 arguments, 1 provided должен был быть твоей подсказкой   -  person bolov    schedule 30.01.2015


Ответы (2)


Если вы привязываете аргумент к функции int g(int, int), в качестве вызываемой функции остается функция, принимающая один int в качестве аргумента, а не два.

Попробуй это:

std::function<int(int)> f3 = std::bind(&g, std::placeholders::_1, 4);
person arayq2    schedule 30.01.2015

тип вашего std::function должен быть:

std::function<int(int)> f3 = std::bind(&g, std::placeholders::_1, 4);
                  ~~~
                  one argument

Ваш bind создает функцию с одним параметром. Вот почему вы называете f3 следующим образом:

std::cout << f3(1) << '\n';

примечание: кандидат ожидает 2 аргумента, предоставлен 1

должен был быть твоей подсказкой

person bolov    schedule 30.01.2015
comment
аааа... Я думал std::function‹return type(signature)›; где подпись означает всю сигнатуру функции, которая передается. Плохо... Большое спасибо - person thassan; 30.01.2015