主要在这个get_function_tag类中。
1![](/Images/OutliningIndicators/None.gif)
2![](/Images/OutliningIndicators/None.gif)
3
// Tags used to decide between different types of functions
4
struct function_ptr_tag {};
5
struct function_obj_tag {};
6
struct member_ptr_tag {};
7
struct function_obj_ref_tag {};
8![](/Images/OutliningIndicators/None.gif)
9
template<typename F>
10
class get_function_tag
11
{
12
typedef typename mpl::if_c<(is_pointer<F>::value),
13
function_ptr_tag,
14
function_obj_tag>::type ptr_or_obj_tag;
15![](/Images/OutliningIndicators/InBlock.gif)
16
typedef typename mpl::if_c<(is_member_pointer<F>::value),
17
member_ptr_tag,
18
ptr_or_obj_tag>::type ptr_or_obj_or_mem_tag;
19![](/Images/OutliningIndicators/InBlock.gif)
20
typedef typename mpl::if_c<(is_reference_wrapper<F>::value),
21
function_obj_ref_tag,
22
ptr_or_obj_or_mem_tag>::type or_ref_tag;
23![](/Images/OutliningIndicators/InBlock.gif)
24
public:
25
typedef or_ref_tag type;
26
};
27![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
2
![](/Images/OutliningIndicators/None.gif)
3
![](/Images/OutliningIndicators/None.gif)
4
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
5
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
6
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
7
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
8
![](/Images/OutliningIndicators/None.gif)
9
![](/Images/OutliningIndicators/None.gif)
10
![](/Images/OutliningIndicators/None.gif)
11
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
12
![](/Images/OutliningIndicators/InBlock.gif)
13
![](/Images/OutliningIndicators/InBlock.gif)
14
![](/Images/OutliningIndicators/InBlock.gif)
15
![](/Images/OutliningIndicators/InBlock.gif)
16
![](/Images/OutliningIndicators/InBlock.gif)
17
![](/Images/OutliningIndicators/InBlock.gif)
18
![](/Images/OutliningIndicators/InBlock.gif)
19
![](/Images/OutliningIndicators/InBlock.gif)
20
![](/Images/OutliningIndicators/InBlock.gif)
21
![](/Images/OutliningIndicators/InBlock.gif)
22
![](/Images/OutliningIndicators/InBlock.gif)
23
![](/Images/OutliningIndicators/InBlock.gif)
24
![](/Images/OutliningIndicators/InBlock.gif)
25
![](/Images/OutliningIndicators/InBlock.gif)
26
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
27
![](/Images/OutliningIndicators/None.gif)
首先用L20 is_reference_wrapper识别出是否function_obj_ref_tag。如果不是,则到L16,看是否member_ptr判断是否member_ptr_tag,如果不是,则到L12,再看看是否is_pointer,如果是则为function_ptr,否则为function_obj
至于这些判断如何实现的,似乎比较复杂,暂时还没有分析清楚。。。