????????????????????????????n????????????????n!????????????5??????ò?д120???????boost???preprocessor???????????Щ??????????????????????????????????????????????preprocessor??????????????????о???????????д???????????????
#ifndef HI_MPL_SUPPORT_LAMBDA_H_INCLUDE
#define HI_MPL_SUPPORT_LAMBDA_H_INCLUDE
#define SUPPORT_LAMBDA_1_IMPL(classname?? A1)                       
template<>                                                     
struct classname##< A1 >                                       
{                                                              
template<typename... TList>                                
struct apply                                               
{                                                          
using type = typename classname##<                     
typename A1::apply<TList...>::type>::type;             
};                                                         
};
#define SUPPORT_LAMBDA_2_IMPL(classname?? A1?? A2)                           
template<>                                                               
struct classname##< A1?? A2 >                                           
{                                                                      
template<typename... TList>                                           
struct apply                                                       
{                                                                   
using type = typename classname##<                               
typename A1::apply<TList...>::type??                           
typename A2::apply<TList...>::type>::type;                   
};                                                                   
};
#define SUPPORT_LAMBDA_3_IMPL(classname?? A1?? A2?? A3)                       
template<>                                                               
struct classname##< A1?? A2?? A3 >                                       
{                                                                       
template<typename... TList>                                           
struct apply                                                       
{                                                                   
using type = typename classname##<                               
typename A1::apply<TList...>::type??                           
typename A2::apply<TList...>::type??                           
typename A3::apply<TList...>::type>::type;                   
};                                                                   
};
#define SUPPORT_LAMBDA_4_IMPL(classname?? A1?? A2?? A3?? A4)                   
template<>                                                               
struct classname##< A1?? A2?? A3?? A4 >                                   
{                                                                       
template<typename... TList>                                           
struct apply                                                       
{                                                                   
using type = typename classname##<                               
typename A1::apply<TList...>::type??                           
typename A2::apply<TList...>::type??                           
typename A3::apply<TList...>::type                           
typename A4::apply<TList...>::type>::type;                   
};                                                                   
};
#define SUPPORT_LAMBDA_5_IMPL(classname?? A1?? A2?? A3?? A4?? A5)               
template<>                                                               
struct classname##< A1?? A2?? A3?? A4?? A5 >                               
{                                                                       
template<typename... TList>                                           
struct apply                                                       
{                                                                   
using type = typename classname##<                               
typename A1::apply<TList...>::type??                           
typename A2::apply<TList...>::type??                           
typename A3::apply<TList...>::type                           
typename A4::apply<TList...>::type                           
typename A5::apply<TList...>::type>::type;                   
};                                                                   
};
#define SUPPORT_LAMBDA_1(classname?? P)                           
SUPPORT_LAMBDA_1_IMPL(classname?? P##1)
#define SUPPORT_LAMBDA_2(classname?? P)                             
SUPPORT_LAMBDA_2_IMPL(classname?? P##1?? P##2)         
SUPPORT_LAMBDA_2_IMPL(classname?? P##2?? P##1)
#define SUPPORT_LAMBDA_3(classname?? P)                             
SUPPORT_LAMBDA_3_IMPL(classname?? P##1?? P##2?? P##3)           
SUPPORT_LAMBDA_3_IMPL(classname?? P##1?? P##3?? P##2)           
SUPPORT_LAMBDA_3_IMPL(classname?? P##2?? P##1?? P##3)           
SUPPORT_LAMBDA_3_IMPL(classname?? P##2?? P##3?? P##1)           
SUPPORT_LAMBDA_3_IMPL(classname?? P##3?? P##1?? P##2)           
SUPPORT_LAMBDA_3_IMPL(classname?? P##3?? P##2?? P##1)
#define SUPPORT_LAMBDA_4(classname?? P)                                   
SUPPORT_LAMBDA_4_IMPL(classname?? P##1?? P##2?? P##3?? P##4)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##1?? P##2?? P##4?? P##3)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##1?? P##3?? P##2?? P##4)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##1?? P##3?? P##4?? P##2)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##1?? P##4?? P##3?? P##2)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##1?? P##4?? P##2?? P##3)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##2?? P##1?? P##3?? P##4)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##2?? P##1?? P##4?? P##3)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##2?? P##3?? P##1?? P##4)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##2?? P##3?? P##4?? P##1)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##2?? P##4?? P##1?? P##3)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##2?? P##4?? P##3?? P##1)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##3?? P##1?? P##2?? P##4)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##3?? P##1?? P##4?? P##2)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##3?? P##2?? P##1?? P##4)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##3?? P##2?? P##4?? P##1)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##3?? P##4?? P##1?? P##2)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##3?? P##4?? P##2?? P##1)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##4?? P##1?? P##2?? P##3)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##4?? P##1?? P##3?? P##2)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##4?? P##2?? P##1?? P##3)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##4?? P##2?? P##3?? P##1)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##4?? P##3?? P##1?? P##2)           
SUPPORT_LAMBDA_4_IMPL(classname?? P##4?? P##3?? P##2?? P##1)
#define SUPPORT_LAMBDA(classname?? n?? prefix)                    
SUPPORT_LAMBDA_##n(classname?? prefix)
#endif
??????????????????λ???????????????SUPPORT_LAMBDA??????????????????λ??????????????????????λ??????????????????????????????
template<typename T?? typename... TList> struct push_back;
template<typename T?? typename... TList>
struct push_back< typelist<TList...>?? T>
{
typedef typelist<TList...?? T> type;
};
template<>
struct push_back< nulllist >
{
typedef nulllist type;
};
SUPPORT_LAMBDA(push_back?? 2?? placeholders::_);
?????????????????λ?????????boost???????????????????????λ????????????????????????????·???????????á?