索引占位符的一些操作

来源:互联网 发布:java ssh 文件下载 编辑:程序博客网 时间:2024/05/24 05:09

索引占位符的一些操作

在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};
};

原创粉丝点击