假设我有两个重载函数定义:
int function_name(std::string);
int function_name(std::string, std::string);
然后,我使用其中一个函数作为结构体的参数
struct My_struct
{
std::function<int(std::string)> function_name;
}
...
My_struct function_struct = { function_name };
这会产生一个错误,因为编译器无法知道我要给它哪个函数。
正如下面的@FantasticMrFox所指出的How do I specify a pointer to an overloaded function?这篇文章中所看到的,一个解决方案是这样使用static_cast
:
static_cast<int(*)(std::string)>(function_name);
然而,另一种方法是使用lambda,如下所示:
My_struct function_struct = { [](std::string my_string) { return function_name(my_string); };
这也会通知编译器我打算使用哪个版本。
有没有更好的方法来做这件事?或者我遗漏了一些语法,用一种更简单的方法来做这件事?
**编辑:**在评论中讨论之后,我编辑了这篇帖子,作为函数指针和lambda之间的比较,读起来更清楚。
1条答案
按热度按时间ldioqlga1#
它与这里的情况略有不同:How do I specify a pointer to an overloaded function?
但这是非常相似的,你想要得到一个std::函数,但要实现这一点,你需要选择正确的函数指针,你需要通知编译器用静态强制转换来解析哪个函数:
通过明确定义正确的函数指针,您可以创建
std::function
。Here is a live example.
“然而”
首先为可读性而写,你可能会对性能感到惊讶。就我个人而言,看到这一点:
比这清楚得多:
因为你不需要函数指针,当你使用you look at the disassembly of each时,你可能会惊讶地发现lambda版本实际上生成的汇编代码更少,因为编译器可以用它做更棘手的事情。