索引占位符的一些操作

索引占位符的一些操作

在boost中,索引占位符有9个:_1,_2,..._9
上一篇中,展示了如何取得最大的索引号,TMaxIndex<_1>::Value为1,TMaxIndex<_9>::Value为9,TMaxIndex<非索引占位符类型>::Value为0;
TMaxIndex<类型1, 类型2, 类型3...>::Value为TMaxIndex<类型1>::Value、TMaxIndex<类型2>::Value、TMaxIndex<类型3>::Value...中的最大值

本篇将展示对索引占位符的其它一些操作:
1. 确定某个索引占位符是否出现,即实现template<typename TIndex, typename TIndexA, typename TIndexB> struct TIn,达到如下要求:
以TIn<TIndex, _1, _3>为例,当TIndex为_1、_3时,TIn<TIndex, _1, _3>::Value为TRUE,否则为FALSE
2. 确保索引占位符是连续的,即禁止bind(_2, _2)这样的调用,在编译时给出编译错误。
3.1 对索引占位符进行计数,即实现template<typename TIndexA, typename TIndexB> struct TCount,达到如下要求:
TCount<_8, _9>::Value为2;TCount<_8, _9, _9, 非索引占位符类型>::Value为3
3.2 对索引占位符进行计数,但忽略重复,如TCount<_8, _9, _9, 非索引占位符类型>::Value为2
实现:
1.
template<typename TIndex, typename TIndexA, typename TIndexB> struct TIn
{
 enum enumValue{Value = TOr<TSameIndex<TIndex, TIndexA>::Value, TSameIndex<TIndex, TIndexB>::Value>::Value};
};
TOr一个辅助模板,功能和操作符||相同(TOr<a, b>::Value:当a不为FALSE时,value的值等于a;否则等于b):
template<BOOL a, BOOL b> struct TOr
{
 enum enumValue{Value = a};
};
template<BOOL b> struct TOr<FALSE>
{
 enum enumValue{Value = b};
};
TSameIndex接受两个参数,当两个参数类型相同时,value为TRUE,否则为FALSE:
template<typename TIndexA, typename TIndexB> struct TSameIndex
{
 enum enumValue{Value = FALSE};
};
template<> struct TSameIndex<_1, _1>
{
 enum enumValue{Value = TRUE};
};
template<> struct TSameIndex<_2, _2>
{
 enum enumValue{Value = TRUE};
};
2. 利用TIn即可解决
template<int maxIndex, typename TIndexA, typename TIndexB, typename TIndexC> struct TUIsContinuous{};//提供主模板
template<typename TIndexA, typename TIndexB, typename TIndexC> struct TUIsContinuous<0>
{
};
template<typename TIndexA, typename TIndexB, typename TIndexC> struct TUIsContinuous<1>
{
 BOOST_STATIC_ASSERT(TIn<_1, TIndexA, TIndexB, TIndexC>::Value);
};
template<typename TIndexA, typename TIndexB, typename TIndexC> struct TUIsContinuous<2>
{
 BOOST_STATIC_ASSERT(TIn<_1, TIndexA, TIndexB, TIndexC>::Value);
 BOOST_STATIC_ASSERT(TIn<_2, TIndexA, TIndexB, TIndexC>::Value);
};
template<typename TIndexA, typename TIndexB, typename TIndexC> struct TUIsContinuous<3>
{
 BOOST_STATIC_ASSERT(TIn<_1, TIndexA, TIndexB, TIndexC>::Value);
 BOOST_STATIC_ASSERT(TIn<_2, TIndexA, TIndexB, TIndexC>::Value);
 BOOST_STATIC_ASSERT(TIn<_3, TIndexA, TIndexB, TIndexC>::Value);
};
template<typename TIndexA, typename TIndexB, typename TIndexC> struct TUIsContinuous : public TUIsContinuous<TMaxIndex<TIndexA, TIndexB, TIndexC>::Value, TIndexA, TIndexB, TIndexC>
{
};
template<...> TReturn bind(Callback callback, TArg1 a1, TArg2 a2, TArg3 a3)
{
 TUIsContinuous<a1, a2, a3>;
}
3.1
template<typename TType> struct TCount { enum enumValue{Value = 0}; };
template<> struct TCount<_1> { enum enumValue{Value = 1}; };
template<> struct TCount<_2> { enum enumValue{Value = 1}; };
template<> struct TCount<_3> { enum enumValue{Value = 1}; };

template<typename TIndexA, typename TIndexB, typename TIndexC> struct TCount
{
 enum enumValue{Value = TCount<TIndexA>::Value + TCount<TIndexB>::Value + TCount<TIndexC>::Value};
};
3.2 利用TIn即可解决(假设TRUE为1,FALSE为0)
template<typename TIndexA, typename TIndexB, typename TIndexC> struct TCount
{
 enum enumValue{Value = TIn<_1, TIndexA, TIndexB, TIndexC>::Value + TIn<_2, TIndexA, TIndexB, TIndexC>::Value + TIn<_3, TIndexA, TIndexB, TIndexC>::Value};
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值