分析boost::function识别输入参数类型

本文介绍了一个用于识别不同函数类型的实用类get_function_tag。该类能够区分函数指针、函数对象、成员指针及函数对象引用,并通过不同的标签进行分类。
能识别四种类型:函数指针,函数对象,成员指针,函数对象的reference
主要在这个get_function_tag类中。

 1None.gif
 2None.gif
 3None.gif// Tags used to decide between different types of functions
 4ExpandedBlockStart.gifContractedBlock.gif      struct function_ptr_tag dot.gif{};
 5ExpandedBlockStart.gifContractedBlock.gif      struct function_obj_tag dot.gif{};
 6ExpandedBlockStart.gifContractedBlock.gif      struct member_ptr_tag dot.gif{};
 7ExpandedBlockStart.gifContractedBlock.gif      struct function_obj_ref_tag dot.gif{};
 8None.gif
 9None.gif      template<typename F>
10None.gif      class get_function_tag
11ExpandedBlockStart.gifContractedBlock.gif      dot.gif{
12InBlock.gif        typedef typename mpl::if_c<(is_pointer<F>::value),
13InBlock.gif                                   function_ptr_tag,
14InBlock.gif                                   function_obj_tag>::type ptr_or_obj_tag;
15InBlock.gif
16InBlock.gif        typedef typename mpl::if_c<(is_member_pointer<F>::value),
17InBlock.gif                                   member_ptr_tag,
18InBlock.gif                                   ptr_or_obj_tag>::type ptr_or_obj_or_mem_tag;
19InBlock.gif
20InBlock.gif        typedef typename mpl::if_c<(is_reference_wrapper<F>::value),
21InBlock.gif                                   function_obj_ref_tag,
22InBlock.gif                                   ptr_or_obj_or_mem_tag>::type or_ref_tag;
23InBlock.gif
24InBlock.gif      public:
25InBlock.gif        typedef or_ref_tag type;
26ExpandedBlockEnd.gif      }
;
27None.gif

首先用L20 is_reference_wrapper识别出是否function_obj_ref_tag。如果不是,则到L16,看是否member_ptr判断是否member_ptr_tag,如果不是,则到L12,再看看是否is_pointer,如果是则为function_ptr,否则为function_obj

至于这些判断如何实现的,似乎比较复杂,暂时还没有分析清楚。。。

转载于:https://www.cnblogs.com/cutepig/archive/2009/03/31/1426682.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值