tuples.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 1,330 行 · 第 1/3 页

HPP
1,330
字号
//      the Nth element in a tuple. See tuple operator[]. Some//      predefined names are provided in sub-namespace//      tuple_index_names./////////////////////////////////////////////////////////////////////////////////template <int N>struct tuple_index {};//////////////////////////////////namespace tuple_index_names {    tuple_index<0> const _1 = tuple_index<0>();    tuple_index<1> const _2 = tuple_index<1>();    tuple_index<2> const _3 = tuple_index<2>();#if PHOENIX_LIMIT > 3    tuple_index<3> const _4 = tuple_index<3>();    tuple_index<4> const _5 = tuple_index<4>();    tuple_index<5> const _6 = tuple_index<5>();#if PHOENIX_LIMIT > 6    tuple_index<6> const _7 = tuple_index<6>();    tuple_index<7> const _8 = tuple_index<7>();    tuple_index<8> const _9 = tuple_index<8>();#if PHOENIX_LIMIT > 9    tuple_index<9> const _10 = tuple_index<9>();    tuple_index<10> const _11 = tuple_index<10>();    tuple_index<11> const _12 = tuple_index<11>();#if PHOENIX_LIMIT > 12    tuple_index<12> const _13 = tuple_index<12>();    tuple_index<13> const _14 = tuple_index<13>();    tuple_index<14> const _15 = tuple_index<14>();#endif#endif#endif#endif}///////////////////////////////////////////////////////////////////////////////////  tuple_common class/////////////////////////////////////////////////////////////////////////////////template <typename DerivedT>struct tuple_base {    typedef nil_t   a_type;    typedef nil_t   b_type;    typedef nil_t   c_type;#if PHOENIX_LIMIT > 3    typedef nil_t   d_type;    typedef nil_t   e_type;    typedef nil_t   f_type;#if PHOENIX_LIMIT > 6    typedef nil_t   g_type;    typedef nil_t   h_type;    typedef nil_t   i_type;#if PHOENIX_LIMIT > 9    typedef nil_t   j_type;    typedef nil_t   k_type;    typedef nil_t   l_type;#if PHOENIX_LIMIT > 12    typedef nil_t   m_type;    typedef nil_t   n_type;    typedef nil_t   o_type;#endif#endif#endif#endif    template <int N>    typename tuple_element<N, DerivedT>::crtype    operator[](tuple_index<N>) const    {        return tuple_element<N, DerivedT>            ::get(*static_cast<DerivedT const*>(this));    }    template <int N>    typename tuple_element<N, DerivedT>::rtype    operator[](tuple_index<N>)    {        return tuple_element<N, DerivedT>            ::get(*static_cast<DerivedT*>(this));    }};///////////////////////////////////////////////////////////////////////////////////  tuple <0 member> class/////////////////////////////////////////////////////////////////////////////////template <>struct tuple<>:   public tuple_base<tuple<> > {    BOOST_STATIC_CONSTANT(int, length = 0);};///////////////////////////////////////////////////////////////////////////////////  tuple <1 member> class/////////////////////////////////////////////////////////////////////////////////template <typename A>struct tuple<A, nil_t, nil_t,#if PHOENIX_LIMIT > 3    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 6    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 9    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 12    nil_t, nil_t, nil_t,#endif#endif#endif#endif    nil_t   //  Unused>:   public tuple_base<tuple<A> > {    BOOST_STATIC_CONSTANT(int, length = 1);    typedef A a_type;    tuple() {}    tuple(        typename call_traits<A>::param_type a_    ):  a(a_) {}    template <typename TupleT>    tuple(TupleT const& init)    :   a(init[tuple_index<0>()])    { BOOST_STATIC_ASSERT(TupleT::length == length); }    A a;};///////////////////////////////////////////////////////////////////////////////////  tuple <2 member> class/////////////////////////////////////////////////////////////////////////////////template <typename A, typename B>struct tuple<A, B, nil_t,#if PHOENIX_LIMIT > 3    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 6    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 9    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 12    nil_t, nil_t, nil_t,#endif#endif#endif#endif    nil_t   //  Unused>:   public tuple_base<tuple<A, B> > {    BOOST_STATIC_CONSTANT(int, length = 2);    typedef A a_type; typedef B b_type;    tuple() {}    tuple(        typename call_traits<A>::param_type a_,        typename call_traits<B>::param_type b_    ):  a(a_), b(b_) {}    template <typename TupleT>    tuple(TupleT const& init)    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()])    { BOOST_STATIC_ASSERT(TupleT::length == length); }    A a; B b;};///////////////////////////////////////////////////////////////////////////////////  tuple <3 member> class/////////////////////////////////////////////////////////////////////////////////template <typename A, typename B, typename C>struct tuple<A, B, C,#if PHOENIX_LIMIT > 3    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 6    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 9    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 12    nil_t, nil_t, nil_t,#endif#endif#endif#endif    nil_t   //  Unused>:   public tuple_base<tuple<A, B, C> > {    BOOST_STATIC_CONSTANT(int, length = 3);    typedef A a_type; typedef B b_type;    typedef C c_type;    tuple() {}    tuple(        typename call_traits<A>::param_type a_,        typename call_traits<B>::param_type b_,        typename call_traits<C>::param_type c_    ):  a(a_), b(b_), c(c_) {}    template <typename TupleT>    tuple(TupleT const& init)    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),        c(init[tuple_index<2>()])    { BOOST_STATIC_ASSERT(TupleT::length == length); }    A a; B b; C c;};#if PHOENIX_LIMIT > 3///////////////////////////////////////////////////////////////////////////////////  tuple <4 member> class/////////////////////////////////////////////////////////////////////////////////template <typename A, typename B, typename C, typename D>struct tuple<A, B, C, D, nil_t, nil_t,#if PHOENIX_LIMIT > 6    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 9    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 12    nil_t, nil_t, nil_t,#endif#endif#endif    nil_t   //  Unused>:   public tuple_base<tuple<A, B, C, D> > {    BOOST_STATIC_CONSTANT(int, length = 4);    typedef A a_type; typedef B b_type;    typedef C c_type; typedef D d_type;    tuple() {}    tuple(        typename call_traits<A>::param_type a_,        typename call_traits<B>::param_type b_,        typename call_traits<C>::param_type c_,        typename call_traits<D>::param_type d_    ):  a(a_), b(b_), c(c_), d(d_) {}    template <typename TupleT>    tuple(TupleT const& init)    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),        c(init[tuple_index<2>()]), d(init[tuple_index<3>()])    { BOOST_STATIC_ASSERT(TupleT::length == length); }    A a; B b; C c; D d;};///////////////////////////////////////////////////////////////////////////////////  tuple <5 member> class/////////////////////////////////////////////////////////////////////////////////template <typename A, typename B, typename C, typename D, typename E>struct tuple<A, B, C, D, E, nil_t,#if PHOENIX_LIMIT > 6    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 9    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 12    nil_t, nil_t, nil_t,#endif#endif#endif    nil_t   //  Unused>:   public tuple_base<tuple<A, B, C, D, E> > {    BOOST_STATIC_CONSTANT(int, length = 5);    typedef A a_type; typedef B b_type;    typedef C c_type; typedef D d_type;    typedef E e_type;    tuple() {}    tuple(        typename call_traits<A>::param_type a_,        typename call_traits<B>::param_type b_,        typename call_traits<C>::param_type c_,        typename call_traits<D>::param_type d_,        typename call_traits<E>::param_type e_    ):  a(a_), b(b_), c(c_), d(d_), e(e_) {}    template <typename TupleT>    tuple(TupleT const& init)    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),        e(init[tuple_index<4>()])    { BOOST_STATIC_ASSERT(TupleT::length == length); }    A a; B b; C c; D d; E e;};///////////////////////////////////////////////////////////////////////////////////  tuple <6 member> class/////////////////////////////////////////////////////////////////////////////////template <    typename A, typename B, typename C, typename D, typename E,    typename F>struct tuple<A, B, C, D, E, F,#if PHOENIX_LIMIT > 6    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 9    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 12    nil_t, nil_t, nil_t,#endif#endif#endif    nil_t   //  Unused>:   public tuple_base<tuple<A, B, C, D, E, F> > {    BOOST_STATIC_CONSTANT(int, length = 6);    typedef A a_type; typedef B b_type;    typedef C c_type; typedef D d_type;    typedef E e_type; typedef F f_type;    tuple() {}    tuple(        typename call_traits<A>::param_type a_,        typename call_traits<B>::param_type b_,        typename call_traits<C>::param_type c_,        typename call_traits<D>::param_type d_,        typename call_traits<E>::param_type e_,        typename call_traits<F>::param_type f_    ):  a(a_), b(b_), c(c_), d(d_), e(e_),        f(f_) {}    template <typename TupleT>    tuple(TupleT const& init)    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),        e(init[tuple_index<4>()]), f(init[tuple_index<5>()])    { BOOST_STATIC_ASSERT(TupleT::length == length); }    A a; B b; C c; D d; E e;    F f;};#if PHOENIX_LIMIT > 6///////////////////////////////////////////////////////////////////////////////////  tuple <7 member> class/////////////////////////////////////////////////////////////////////////////////template <    typename A, typename B, typename C, typename D, typename E,    typename F, typename G>struct tuple<A, B, C, D, E, F, G, nil_t, nil_t,#if PHOENIX_LIMIT > 9    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 12    nil_t, nil_t, nil_t,#endif#endif    nil_t   //  Unused>:   public tuple_base<tuple<A, B, C, D, E, F, G> > {    BOOST_STATIC_CONSTANT(int, length = 7);    typedef A a_type; typedef B b_type;    typedef C c_type; typedef D d_type;    typedef E e_type; typedef F f_type;    typedef G g_type;    tuple() {}    tuple(        typename call_traits<A>::param_type a_,        typename call_traits<B>::param_type b_,        typename call_traits<C>::param_type c_,        typename call_traits<D>::param_type d_,        typename call_traits<E>::param_type e_,        typename call_traits<F>::param_type f_,        typename call_traits<G>::param_type g_    ):  a(a_), b(b_), c(c_), d(d_), e(e_),        f(f_), g(g_) {}    template <typename TupleT>    tuple(TupleT const& init)    :   a(init[tuple_index<0>()]), b(init[tuple_index<1>()]),        c(init[tuple_index<2>()]), d(init[tuple_index<3>()]),        e(init[tuple_index<4>()]), f(init[tuple_index<5>()]),        g(init[tuple_index<6>()])    { BOOST_STATIC_ASSERT(TupleT::length == length); }    A a; B b; C c; D d; E e;    F f; G g;};///////////////////////////////////////////////////////////////////////////////////  tuple <8 member> class/////////////////////////////////////////////////////////////////////////////////template <    typename A, typename B, typename C, typename D, typename E,    typename F, typename G, typename H>struct tuple<A, B, C, D, E, F, G, H, nil_t,#if PHOENIX_LIMIT > 9    nil_t, nil_t, nil_t,#if PHOENIX_LIMIT > 12    nil_t, nil_t, nil_t,#endif#endif    nil_t   //  Unused>:   public tuple_base<tuple<A, B, C, D, E, F, G, H> > {    BOOST_STATIC_CONSTANT(int, length = 8);    typedef A a_type; typedef B b_type;    typedef C c_type; typedef D d_type;    typedef E e_type; typedef F f_type;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?