正确调用参数化的std :: function

时间:2019-04-29 18:16:13

标签: c++ std-function

我是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 个答案:

答案 0 :(得分:1)

根据the RapidJSON documentation,其DocumentValue类型是提供移动语义操作但不提供复制语义的不变式:

  
      
  • Q。什么是移动语义?为什么?

  •   
  • A。在Value中使用移动语义代替复制语义。那   表示在将源值分配给目标值时,所有权   源值的百分比已移至目标值。

         

    由于移动速度比复制快,因此此设计决定迫使用户   了解复制开销。

  •   

由于您没有列出修改本示例以传递rapidjson::Document&引用而不是std::string const&引用时所做的其余代码更改,因此应仔细检查set_callback(…)功能与此更改保持同步(如果可能,请更新您的帖子以反映此情况),并确保您的功能签名对移动语义友好(例如,能够接收rapidjson::Document&&右值引用)。

另外,正如上面的Nichol Bolas所提到的,您发布的错误消息可能会使用某些上下文(它发生在哪一行;正在使用哪个编译器,&c)。