c++ 使用lambda通知编译器要使用哪个函数定义的替代方法

bxjv4tth  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(281)

假设我有两个重载函数定义:

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之间的比较,读起来更清楚。

ldioqlga

ldioqlga1#

它与这里的情况略有不同:How do I specify a pointer to an overloaded function?
但这是非常相似的,你想要得到一个std::函数,但要实现这一点,你需要选择正确的函数指针,你需要通知编译器用静态强制转换来解析哪个函数:

int function_name(std::string);
int function_name(std::string, std::string);

...

std::function<int(std::string)> f = static_cast<int(*)(std::string)>(function_name);

通过明确定义正确的函数指针,您可以创建std::function
Here is a live example.
“然而”
首先为可读性而写,你可能会对性能感到惊讶。就我个人而言,看到这一点:

My_struct function_struct = { [](std::string my_string) { return function_name(my_string); };

比这清楚得多:

My_struct f = static_cast<int(*)(std::string)>(function_name);

因为你不需要函数指针,当你使用you look at the disassembly of each时,你可能会惊讶地发现lambda版本实际上生成的汇编代码更少,因为编译器可以用它做更棘手的事情。

相关问题