正确调用参数化 std::函数
Properly calling a parameterized 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);
}
根据 RapidJSON 文档,它的Document
和Value
类型是不变量,提供移动语义操作,但不提供复制语义:
问。什么是移动语义?为什么?
一个。在值中使用移动语义,而不是复制语义。那 表示,在将源值分配给目标值时,所有权 的源值将移动到目标值。
由于移动比复制更快,因此此设计决策迫使用户 了解复制开销。
由于您没有列出在重新调整此示例以传递rapidjson::Document&
引用而不是std::string const&
引用时所做的其余代码更改,因此您应该仔细检查您的set_callback(…)
函数是否与此更改同步(如果可能,请更新您的帖子以反映这一点)并确保您的功能签名对移动语义友好(例如,能够接收rapidjson::Document&&
右值引用)。
此外,正如Nichol Bolas上面提到的,您发布的错误消息可以使用一些上下文(它发生在哪一行;正在使用哪个编译器,等等)。
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- std::函数常量正确性未遵循
- 具有变量Number of Arguments的std::函数的矢量
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 如何将类 1 的 std::函数绑定到类 2 的函数?
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 如何将 STL 队列推送函数绑定到 std::函数?
- std::函数不起作用,但普通的旧函数指针可以 - 为什么?
- 获取 std::函数以推断按引用传递/按值传递
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 从其存储的回调中删除 std::函数是否安全
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 创建一个带有 lambda 的 std::函数,而不知道函数的参数
- std::函数的解释
- 在调用过程中删除 std::函数