在C++中,括号内的单个星号(*)是什么作用?

5
我发现了类似于这样的代码:
typedef std::map<std::string, Example*(*)()> map_type;

经过一段时间的搜索,我仍然无法确切地了解 (*) 运算符的作用。 有人有任何想法吗?


1
你会喜欢这个网站:cdecl.org。如果你成功将表达式转换为有效的C代码,它会告诉你它的含义。 - Jonas Schäfer
哇,谢谢你提供的链接,看起来很有用! - autobahn
哦,是的,我猜是用于C语言,但仍然收藏了!有人知道有类似的东西用于C ++吗? - autobahn
1
@autobahn 对于 C++ 来说,http://cdecl.org 通常也很好用。在这里也可以使用。 - David Heffernan
@DavidHeffernan:我刚刚尝试了一下他的代码...不起作用。http://cdecl.org/?q=typedef%20std::map%3Cstd::string,%20Example*%28*%29%28%29%3E%20map_type(不要点击,需要复制此链接并尝试) - Engineer2021
显示剩余7条评论
4个回答

7
这里的括号用于强制改变优先级。这种类型
Example*(*)()

这是一个指向返回 Example 指针的函数的指针。

如果没有括号,你会得到

Example**()

这将是一个返回指向指针的函数,指针指向Example

5
这是声明指向函数(在您的情况下)或数组时使用的语法。以以下声明为例:
typedef Example* (*myFunctionType)();

这将使该行

typedef std::map<std::string, myFunctionType> map_type;

要确切地等同于您给出的行。请注意,Example* (*myFunctionType)()Example* (*)()之间的区别仅在于类型名称被省略。


0
这是一个函数指针声明。
这个typedef表示std::map将字符串映射到接收void并返回Example*的函数指针。
你可以像这样使用它:
#include <string>
#include <map>

typedef  int Example;

Example* myExampleFunc() {
    return new Example[10];
};

typedef std::map<std::string, Example*(*)()> map_type;

int main() {

    map_type myMap;
    // initializing
    myMap["key"] = myExampleFunc;

    // calling myExampleFunc

    Example *example = myMap["key"]();

    return 0;
}

-1

因为模板typedef的存在,您可以在C++11中使复杂的指针类型变得不那么混乱:

template<typename T> using ptr = T*;

typedef std::map<std::string, ptr<Example*()>> map_type;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接