当前位置: 首页 > 知识库问答 >
问题:

用const void *将std::function作为参数传递

陶富
2023-03-14

我有下面的函数声明:

void get_data(struct myStruct* const value, const void * const data);

我有另一个函数,我想添加一个< code>std::function作为参数:

// I think the std::function definition is where my problem is
template<typename MyType>
void process(bool test, std::function<void(MyType* const, const void* const)>& callb) { ... }

然而,我不知道该如何称呼它,或者说我上面的定义是否正确:

bool test1 = true;
process<myStruct>(test1, get_data);

编译器错误:

error: prototype for ‘void process(bool, std::function<void(MyType* const, const void* const)>&)’ does not match any in class ‘MyClass’
 void process(bool test,
error: candidate is: template<class MyType> void process(bool, std::function<void(MyType*, const void*)>&)
     void process(bool test,
... goes on

有什么想法吗?

共有2个答案

夏经武
2023-03-14

将< code>get_value传递给< code>callb时,编译器必须为< code>callb构造一个临时的< code>std::function对象。但是< code>callb被声明为非常数引用,不能绑定到临时对象。因此,请将< code>callb改为一个const引用,它可以绑定到一个临时:

template<typename MyType>
void process(bool test, const std::function<void(MyType* const, const void* const)>& callb) { ... }

现场演示

何昆
2023-03-14

基本上只需从函数对象中删除引用:

void process(bool test, std::function<void(MyType* const, const void* const)> callb);

虽然对std::function对象的引用不能与底层函数指针类型相关/转换,但由于其构造函数,非引用对象可以隐式转换为函数指针类型。

编辑:将< code>std::function作为常量引用传递不会带来性能上的好处,但在某些情况下可能会带来一些损失,请参见我应该通过常量引用传递std::function吗?

 类似资料:
  • 代码如下: 我假设错误发生在insert函数中,并且与参数初始化有关。 bintree.cpp:65:27:错误:使用删除的函数'std::unique_ptr<_tp,_dp>::unique_ptr(const std::unique_ptr<_tp,_dp>&)[with_tp=bintreenode;_dp=std::default_delete>]“tree.insert(tree.ro

  • 代码如下(为简洁起见摘录): 颜色h: 颜色cpp: 我得到以下错误: 颜色cpp:16:29:错误:传递“const std::map” 错误指的是“返回颜色[cColortype];”在getColorText中。 我写这篇文章是为了一个类项目,我可以通过删除getColorText签名中的const声明来让它工作,但我正在尝试学习/采用良好的实践,并遵循建议,在不修改数据的成员函数中使用co

  • 问题内容: 如何在不执行“父”函数或不使用函数的情况下将函数作为参数传递?(因为我已经读到它是不安全的。) 我有这个: 它可以工作,但是问题是在调用函数时触发,而不是在函数中使用时触发。 根据我所读的内容,我可以使用来解决它,但这不是最佳实践。如何在JavaScript中将函数作为参数传递? 问题答案: 您只需要删除括号: 然后,这将传递函数而不先执行它。 这是一个例子:

  • 问题内容: 我可以将数组作为url参数传递的最佳方法是什么?我在想这是否可能: 还是这样: 香港专业教育学院阅读示例,但我发现它很混乱: 问题答案: 有一个非常简单的解决方案:。它把您的查询参数作为一个关联数组: 将返回 为您处理所有必需的转义(=> 和=> ),因此此字符串等于。

  • 问题内容: 我有3类调用,和。 在我的课程中,我想要一个这样的方法: 因此,例如,我想: 如何将类名作为参数,并基于该类名从类名创建适当的对象? 问题答案: 使用反射是可能的。这里是给定的className(作为字符串传递)。此类将在内存中搜索(应该已经加载)。 作为字符串传递时要实例化的类的名称应 完全限定

  • 我有一个简单的方法,我想把片段名作为参数传递。我几乎没有像这样的碎片 1) AddNewDatesFragment 2) AskFragment 3)免责声明片段 我有下面的代码可以正常工作 我想在方法中编写一些代码,在这里我可以调用这样的方法 等 我曾经尝试过这样的代码,但在if条件下不工作会导致编译时错误。 我对实施这种方法感到好奇。谢谢