【问题标题】:passing std::function as parameter with const void *使用 const void * 传递 std::function 作为参数
【发布时间】:2018-04-20 10:19:00
【问题描述】:

我有以下函数声明:

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

我有另一个函数,我想添加一个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);

编译器错误:

错误:‘void process(bool, std::function&)’的原型与‘MyClass’类中的任何内容都不匹配 无效进程(布尔测试, 错误:候选是:模板 void process(bool, std::function&) 无效进程(布尔测试, ... 继续

有什么想法吗?

【问题讨论】:

  • 您是否遇到编译器错误?
  • @arias_JC,编译器错误在哪里?
  • @arias_JC 请编辑您的问题以包含您遇到的错误
  • 添加编译器错误

标签: c++ c++11


【解决方案1】:

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

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

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

编辑:将std::function 作为 const 引用传递不会带来性能优势,但实际上可能在某些极端情况下包含一些惩罚,请参阅Should I pass an std::function by const-reference?

【讨论】:

  • 使callb 成为常​​量引用also works。
  • 啊,所以我正在从 cpp 文件中删除 &amp; 并忘记从标题中删除,哇。谢谢这个作品。
【解决方案2】:

当将get_value 传递给callb 时,编译器必须为callb 构造一个临时的std::function 对象。但是callb 被声明为非常量引用,不能绑定到临时对象。所以让 callb 成为一个 const 引用,它可以绑定到一个临时的:

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

Live Demo

【讨论】:

  • 这也可以,可能是我的情况更好的解决方案
  • @arias_JC 不一定。无论哪种方式,您最终都会调用 std::function 的构造函数,一次用于临时(在这种情况下),然后通过 const 引用访问该临时对象(在这种情况下),一次用于函数本地对象。另请参阅我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2014-12-11
  • 2014-02-19
相关资源
最近更新 更多