У меня такой код:
void MyClass::create_msg(MyTime timestamp) {
// do things here ...
}
и я попытался создать std :: bind для указанной выше функции:
MyMsg MyClass::getResult(MyTime timestamp) {
// do things here ...
std::bind(create_msg(), timestamp);
// do things ...
}
Но возникла следующая ошибка:
error: too few arguments to function call, single argument 'timestamp' was not specified
std::bind(create_msg(), timestamp);
~~~~~~~~~~ ^
MyClass.cpp:381:1: note: 'create_msg' declared here
void MyClass::create_msg(MyTime timestamp) {
^
1 error generated.
Что я сделал не так в этом случае? Спасибо!
Кстати, такая же ошибка, если я:
std::bind(&MyClass::create_msg(), this, timestamp);
@pstrjds, но это функция-член, поэтому он должен быть std::bind(&MyClass::create_msg, this, timestamp)
@clcto - Вы правы - мое плохое. Я быстро набирал текст и забыл принять во внимание, что это функция-член.
В &MyClass::create_msg() теряем скобки -> &MyClass::create_msg
Дополнительное полезное чтение: Как std :: bind работает с функциями-членами





Здесь есть три проблемы.
Во-первых, аргумент, который вы даете std::bind в качестве своей функции, в настоящее время - create_msg(). Это означает «вызвать create_msg, взять любой результат и передать его в качестве первого аргумента в std::bind». Это не то, что вы хотите - вместо этого вы имели в виду «взять create_msg и передать его в качестве первого параметра в std::bind». Поскольку create_msg является функцией-членом, вам нужно получить указатель на нее следующим образом:
std::bind(&MyClass::create_msg, /* ... */)
Это решит одну проблему, но затем появится другая. При использовании std::bind с указателем на функцию-член необходимо подтвердить наличие std::bind с дополнительным параметром, соответствующим объекту-получателю, который будет использоваться при вызове этой функции-члена. Я считаю, что в вашем случае вы хотите, чтобы текущий объект был приемником, который выглядел бы так:
std::bind(&MyClass::create_msg, this, timestamp)
Это должно работать правильно.
Однако можно возразить, что здесь есть третья проблема - вместо использования std::bind, почему бы просто не использовать лямбда-выражение?
[timestamp, this] { create_msg(timestamp); }
Есть ли причина использовать
bindвместо лямбды?