Правильный вызов параметризованной функции std :: function - PullRequest
0 голосов
/ 29 апреля 2019

Я новичок в std::function и использую его для тривиальных задач.Один из моих проектов передает std::string в std::function() - но теперь я бы хотел вместо него передать rapidjson::Document.

Почему std::string бесперебойно работает, а rapidjson::Document - нет?Это потому, что объект документа расположен в стеке, а не в куче?Должен ли я обернуть это в умный указатель?

Я изо всех сил пытаюсь понять саму ошибку и надеюсь, что кто-то может объяснить, что это значит: call of an object of a class type without appropriate operator() or conversion function to pointer-to-function type

Вот мой существующий код:

std::function<void(const std::string&)> callback_;

...

bool set_callback(std::function<void(const std::string&)>&& callback) {
    callback_ = callback;
}

void some_event() {
    std::string serialize = serializer.to_string(an_object);

    callback_(data);
}

...

// The callback event
void the_callback(const std::string& data) {
    std::cout << data << std::endl;
}

Обратный вызовтеперь возьмет объектный документ, и сериализация будет полностью выполнена в другом классе.Поэтому я хотел бы, чтобы мой std::function отразил это:

std::function<void(rapidjson::Document&)> callback_;

...

void some_event() {
    rapidjson::Document document = serializer.get_document();

    // This is where the error occurs
    callback_(document);
}

1 Ответ

1 голос
/ 29 апреля 2019

Согласно документации RapidJSON , ее типы Document и Value являются инвариантами, которые обеспечивают операции семантики перемещения, но не семантику копирования:

  • Q. Что такое семантика перемещения? Почему?

  • A. Вместо семантики копирования, семантика перемещения используется в Value. Тот означает, что при назначении исходного значения целевому значению исходного значения перемещается в целевое значение.

    Поскольку перемещение происходит быстрее, чем копирование, это дизайнерское решение заставляет пользователя знать о копировании.

Поскольку вы не перечислили оставшиеся изменения кода, которые вы сделали, перекомпоновав этот пример для передачи ссылок rapidjson::Document& вместо std::string const& ссылок, вам следует дважды проверить, что ваша функция set_callback(…) синхронизирована с этим измените (и, если возможно, обновите свой пост, чтобы отразить это) и убедитесь, что ваши функциональные сигнатуры дружественны к семантике перемещения (например, способны получать rapidjson::Document&& rvalue ссылок).

Кроме того, как упоминал Никол Болас, сообщение об ошибке, которое вы разместили, может использовать некоторый контекст (в какой строке это произошло; какой компилятор использовался и т. Д.).

...