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

问题描述 投票:0回答:1

我是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);
}
c++ std-function
1个回答
1
投票

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

  • 问:什么是移动语义?为什么?
  • 答:而不是复制语义,在Value中使用移动语义。这意味着,在将源值分配给目标值时,源值的所有权将移动到目标值。 由于移动比复制更快,因此该设计决策迫使用户意识到复制开销。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.