Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正确调用参数化std::函数_C++_Std Function - Fatal编程技术网

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 theset\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);
}