返回函数指针的函数的签名

Signature for function returning a function pointer

本文关键字:函数 指针 返回      更新时间:2023-10-16

我知道在很多情况下最好不要问为什么,但这个函数签名对我来说毫无意义。我知道我们应该使用 typedefs,但我想看看我是否可以理解如何在没有以下情况下做到这一点:

bool(*fn)(std::string&);    // This is function pointer
void funcTakingFunc1(bool(*)(std::string&)) { } // This works for function arguments
bool(*)(std::string&) funcReturningFunc() {}    // Trying the same as return type, doesn't work
bool(*funcReturningFunc2(std::string&))() {}        // This is what I found on another SO question

最后一个我认为是对的,这对我来说毫无意义,函数名称和"返回函数"的参数是从左到右切换的。对此有什么解释吗?

具体来说,我正在尝试创建一个接受std::string&的函数,并返回一个指向bool (*)(std::string&)的函数指针,但这不起作用:

bool (*getConsoleCmdByName)(std::string&)(std::string& cmd);

编辑:事实证明这是正确的,我认为:

bool (*getConsoleCmdByName(std::string&))(std::string& cmd);

贾罗德建议:

auto getConsoleCmdByName(std::string&) -> bool (*)(std::string&)

作为一种可能性,这对我来说似乎足够清楚。

为此,存在更容易理解的复杂表达式 顺时针/螺旋规则

+---------------------------------+
|                                 |
|       +----------+              |
|       ^          |              |
bool(*funcReturningFunc2(std::string&))() {}
^    ^                  |              |
|    +------------------+              |
|                                      |
+--------------------------------------+

你可能会问,什么是funcReturningFunc2

  • funcReturningFunc2 是一个传递对字符串的引用的函数
  • funcReturningFunc2 是一个函数,将引用传递给返回指针的字符串
  • funcReturningFunc2 是一个函数,将引用传递给一个字符串,返回指向函数的指针,不传递任何内容并返回
  • funcReturningFunc2 是一个函数,将引用传递给一个字符串,返回指向函数的指针,该函数不传递任何内容并返回bool

众所周知,老式的函数指针声明很难阅读。

C++11 为标准库提供了一些类型支持工具,可用于简化复杂的声明,例如

using ret_t = std::add_pointer_t<bool(std::string&)>;
using func_ptr_t = std::add_pointer_t<ret_t(std::string&)>;