Параметр std::bind для функции-члена без объекта

Мне нужно привязать один параметр к функции-члену класса. Что-то вроде этого:

#include <functional>
#include <iostream>

struct test
{
    void func(int a, int b)
    {
        std::cout << a << " " << b << std::endl;
    }
};

int main(int argc, char** argv)
{
    typedef void (test::*TFunc)(int);
    TFunc func = std::bind(&test::func, 1, std::placeholders::_1);
}

Но в этом случае у меня ошибка компиляции

error: static assertion failed: Wrong number of arguments for pointer-to
-member

person tenta4    schedule 26.09.2017    source источник
comment
Вы, вероятно, не должны ожидать, что объект, созданный std::bind, будет преобразован в простой указатель функции-члена...   -  person Quentin    schedule 26.09.2017
comment
Если вы ищете способ по существу определить функцию-член вне определения класса, то это просто невозможно. Вы можете только добавить перегрузку к классу или определить свободную функцию.   -  person Peter Ruderman    schedule 26.09.2017


Ответы (1)


std::bind не возвращает указатель на функцию-член, но может создавать объект std::function, который можно использовать позже:

::std::function< void (test *, int)> func = std::bind(&test::func, std::placeholders::_1, 1, std::placeholders::_2);
test t{};
func(&t, 2);
person user7860670    schedule 26.09.2017
comment
Спасибо за ответ, но ваше решение немного отличается от моих требований - person tenta4; 26.09.2017
comment
@tenta4 тип возвращаемого значения std::bind всегда является объектом (некоторого) типа класса. Нет преобразования из этого в функцию-указатель-член. Во-первых, связанному int некуда идти. - person Caleth; 26.09.2017