C++ 正确调用参数化std::函数
我不熟悉C++ 正确调用参数化std::函数,c++,std-function,C++,Std Function,我不熟悉std::function,并且一直在为琐碎的任务使用它。我的一个项目将std::string传递到std::function()——但现在我想传递一个rapidjson::Document 为什么std::string可以无缝工作,而rapidjson::Document不能?是因为文档对象是在堆栈而不是堆上分配的吗?我应该用智能指针把它包起来吗 我正在努力理解错误本身,希望有人能解释它的含义:调用类类型的对象,而不使用适当的运算符()或将函数转换为指向函数类型的指针 以下是我现有的代
std::function
,并且一直在为琐碎的任务使用它。我的一个项目将std::string
传递到std::function()
——但现在我想传递一个rapidjson::Document
为什么std::string
可以无缝工作,而rapidjson::Document
不能?是因为文档对象是在堆栈而不是堆上分配的吗?我应该用智能指针把它包起来吗
我正在努力理解错误本身,希望有人能解释它的含义:调用类类型的对象,而不使用适当的运算符()或将函数转换为指向函数类型的指针
以下是我现有的代码:
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;
}
根据,其文档
和值
类型是提供移动语义操作但不提供复制语义的不变量:
- 什么是移动语义?为什么?
- A.值中使用移动语义而不是复制语义。那个 在将源值指定给目标值时,表示所有权 将源值的值移动到目标值 由于移动比复制快,因此此设计决策强制用户 了解复制开销
rapidjson::Document&
引用而不是std::string const&
引用时,您没有列出所做的其余代码更改,因此应再次检查set\u回调(…)
函数是否与此更改同步(如果可能,更新您的帖子以反映这一点)并确保您的功能签名是移动语义友好的(例如,能够接收rapidjson::Document&
rvalue引用)
此外,正如Nichol Bolas前面提到的,您发布的错误消息可能会使用一些上下文(它发生在哪一行;使用的是哪一个编译器,&c).如果要提供错误,则需要提供产生错误的代码行。像这样的代码片段不足以诊断您的问题——它们在隔离状态下看起来很好,并且可能可以与适当的其他代码配合使用以使其正常工作。您需要提供一个I have updated the
set\u callback()
来反映这些变化。我在我的原始代码中使用了typedef
,但为了更清晰起见,我决定在我的帖子中不使用它。但我将更新OP以更好地反映我在纸上的内容。看起来这个问题与我的typedef
直接相关。不确定为什么,但执行typedef std::function f_callback
不起作用。@user0000001我认为您将std::function
的使用与typedef
s可调用的方式混淆了:您可能只想执行typedef std::add_pointer\u t f_callback
——注意在这种情况下函数的签名是如何影响其类型标识的。这样做是一种更清晰的方式比使用惯用C语言风格的函数指针更有效。user0000001…这里的要点是:您不需要专门化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);
}