签名函数返回函数指针

时间:2017-08-28 10:05:31

标签: c++ function pointers return

我知道在很多情况下最好不要问为什么,但这个功能签名对我来说毫无意义。我知道我们应该使用typedef,但我想看看我是否能理解如何在没有它的情况下这样做:

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);

Jarod建议:

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

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

2 个答案:

答案 0 :(得分:3)

出于此目的,更容易理解复杂的表达式Clockwise/spiral规则

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

您可能会问, funcReturningFunc2 是什么?

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

答案 1 :(得分:0)

旧学校指向函数的声明非常难以阅读。

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

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