C++11模拟boost元占位符placeholder
作者:网络转载 发布时间:[ 2014/11/3 11:36:47 ] 推荐标签:C++ NET 类
这确实非常帅。很可惜当参数个数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的要简洁了很多。当然还缺少匿名占位符这样的手法,这里提供一个简易的思路,望你有所得。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。

sales@spasvo.com