其他分享
首页 > 其他分享> > c – 如何在模板化的函数指针声明中读取这么多的星号和括号?

c – 如何在模板化的函数指针声明中读取这么多的星号和括号?

作者:互联网

参见英文答案 > Complex C declaration                                    7个
Introduction to the C++11 feature: trailing return types开始

文章声称

template <class T> class tmp {
public:
    int i;
};

auto foo()->auto(*)()->tmp<int>(*)(){
    return 0;
}

相当于

template <class T> class tmp{
public:
    int i;
};

tmp<int> (*(*foo())())() {
    return 0;
}

我不理解第二个代码示例中的复杂函数.我应该在一开始看哪里?我猜是foo.但foo旁边的统计数据将foo定义为指针……
基于第一个代码示例,我将把这个片段转换为

tmp<int> (*)() (*)() foo(){ return 0;}

所以foo是一个返回0的函数,但返回类型很棘手:它的返回类型是函数指针,其返回类型又是一个返回类型为tmp< int>的函数指针.

解决方法:

与@Vittorio答案相辅相成,有Clockwise Spiral Rule帮我们decypher复杂类型:

从未知元素开始,以螺旋/顺时针方向移动;当遇到以下元素时,用相应的英语语句替换它们:

> [X]或[]

Array X size of… or Array undefined size of…

>(type1,type2)

Function passing type1 and type2 returning…

> *

pointer(s) to…

继续以螺旋/顺时针方向执行此操作,直到所有令牌都被覆盖.始终先解决括号中的任何内容!

这里:

           +-----------+
           | +------+  |
           | | >-v  |  |
temp<int> (*(*foo())())()
        |  | ^---+  |  |
        |  ^--------+  |
        +--------------+

foo是一个返回指向函数的指针的函数,该函数返回一个返回temp< int>的函数的指针.

现在,@ UKmonkey刚刚将此规则重命名为C Guru Snail Rule或简称CGSR:

 / /
 L_L_
/    \
|00  |       _______
|_/  |      /  ___  \
|    |     /  /   \  \
|    |_____\  \_  /  /
 \          \____/  /_____
  \ _______________/______\.............................

标签:c,c11,declaration,function-pointers
来源: https://codeday.me/bug/20190930/1835981.html