Как передать параметр в std :: bind из функции - PullRequest
0 голосов
/ 29 августа 2018

Я работаю на C ++ 11.

Я хочу написать функцию funA в классе, которая связывает другую функцию funB в том же классе. А функция funB является параметром в функции funA. Какой может быть синтаксис funcA? Я пытался использовать std :: function func, но я не могу скомпилировать. Пожалуйста, объясните.

Спасибо.

class ServiceClass
{
typedef std::function<void(const int&, const int&)> ServiceCallBack;

public:
void ServiceFunc(ServiceCallBack callback)
{
    callback(1,2);
}
};

class MyClass
{
public:

ServiceClass serviceClass;

void myFunction(int i)
{
    cout << __FUNCTION__ << endl;
    cout << i << endl;
}

void myFunction2(int i)
{
    cout << __FUNCTION__ << endl << i << endl;
}

void bindFunction(std::function<void()> func)
{
    std::bind(func, this, std::placeholders::_1);
    func();
}

void testmyFunction()
{
    serviceClass.ServiceFunc( std::bind(
                                  MyClass::myFunction,
                                  this,
                                  std::placeholders::_1
                                  ));
}

void testmyFunction2()
{
    serviceClass.ServiceFunc( std::bind(
                                  MyClass::myFunction2,
                                  this,
                                  std::placeholders::_1
                                  ));
}

void testFunctions( int i )
{
    if( i == 1 )
    {
        serviceClass.ServiceFunc( std::bind( MyClass::myFunction, this, std::placeholders::_1 ));
    }
    else if( i == 2 )
    {
        serviceClass.ServiceFunc( std::bind( MyClass::myFunction2, this, std::placeholders::_1 ));
    }
}
};

Исходя из некоторых условий, в функции testFunctions я хочу вызвать любую из функций обратного вызова, myFunction или myFunction2. Так что если a может изменить testFunctions для получения параметра, который может принимать любую функцию обратного вызова, тогда мне не нужно писать условия if else.

Пожалуйста, предложите.

1 Ответ

0 голосов
/ 01 сентября 2018
typedef void(MyClass::*MY_CLASS_PTR)(int);
// function which takes function pointer as parameter
void testFunctions( MY_CLASS_PTR fptr)
{
// fptr should have which function to bind 
  serviceClass.ServiceFunc( std::bind( fptr , this, std::placeholders::_1 ));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...