这确实非常帅。很可惜当参数个数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的要简洁了很多。当然还缺少匿名占位符这样的手法,这里提供一个简易的思路,望你有所得。