std::bind: error: слишком мало аргументов для вызова функции, один аргумент не указан

У меня есть следующий код:

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);

1 ответ

Решение

Здесь есть три вопроса.

Во-первых, аргумент, который вы даете 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); }
Другие вопросы по тегам