我知道在很多情况下最好不要问为什么,但这个功能签名对我来说毫无意义。我知道我们应该使用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&)
作为一种可能性,这对我来说似乎很清楚。
答案 0 :(得分:3)
出于此目的,更容易理解复杂的表达式Clockwise/spiral规则
+---------------------------------+
| |
| +----------+ |
| ^ | |
bool(*funcReturningFunc2(std::string&))() {}
^ ^ | |
| +------------------+ |
| |
+--------------------------------------+
您可能会问, 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&)>;