⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tuple_basic_no_partial_spec.hpp

📁 boost库提供标准的C++ API 配合dev c++使用,功能更加强大
💻 HPP
📖 第 1 页 / 共 2 页
字号:
      typename detail::element_ref<N, cons<Head, Tail> >::RET
      get(cons<Head, Tail>& t)
      {
        return get_class<N-1>::get(t.tail);
      }

      template<typename Head, typename Tail>
      static inline
      typename detail::element_const_ref<N, cons<Head, Tail> >::RET
      get(const cons<Head, Tail>& t)
      {
        return get_class<N-1>::get(t.tail);
      }
    };

    template<>
    struct get_class<0>
    {
      template<typename Head, typename Tail>
      static inline
      typename add_reference<Head>::type
      get(cons<Head, Tail>& t)
      {
        return t.head;
      }

      template<typename Head, typename Tail>
      static inline
      typename add_reference<const Head>::type
      get(const cons<Head, Tail>& t)
      {
        return t.head;
      }
    };

    } // namespace detail

    // tuple class
    template<
      typename T1,
      typename T2,
      typename T3,
      typename T4,
      typename T5,
      typename T6,
      typename T7,
      typename T8,
      typename T9,
      typename T10
    >
    class tuple :
      public detail::map_tuple_to_cons<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::cons1
    {
    private:
      typedef detail::map_tuple_to_cons<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> mapped_tuple;
      typedef typename mapped_tuple::cons10 cons10;
      typedef typename mapped_tuple::cons9 cons9;
      typedef typename mapped_tuple::cons8 cons8;
      typedef typename mapped_tuple::cons7 cons7;
      typedef typename mapped_tuple::cons6 cons6;
      typedef typename mapped_tuple::cons5 cons5;
      typedef typename mapped_tuple::cons4 cons4;
      typedef typename mapped_tuple::cons3 cons3;
      typedef typename mapped_tuple::cons2 cons2;
      typedef typename mapped_tuple::cons1 cons1;

      typedef typename detail::add_const_reference<T1>::type t1_cref;
      typedef typename detail::add_const_reference<T2>::type t2_cref;
      typedef typename detail::add_const_reference<T3>::type t3_cref;
      typedef typename detail::add_const_reference<T4>::type t4_cref;
      typedef typename detail::add_const_reference<T5>::type t5_cref;
      typedef typename detail::add_const_reference<T6>::type t6_cref;
      typedef typename detail::add_const_reference<T7>::type t7_cref;
      typedef typename detail::add_const_reference<T8>::type t8_cref;
      typedef typename detail::add_const_reference<T9>::type t9_cref;
      typedef typename detail::add_const_reference<T10>::type t10_cref;
    public:
      typedef cons1 inherited;
      typedef tuple self_type;

      tuple() : cons1(T1(), cons2(T2(), cons3(T3(), cons4(T4(), cons5(T5(), cons6(T6(),cons7(T7(),cons8(T8(),cons9(T9(),cons10(T10()))))))))))
        {}

      tuple(
          t1_cref t1,
          t2_cref t2,
          t3_cref t3 = T3(),
          t4_cref t4 = T4(),
          t5_cref t5 = T5(),
          t6_cref t6 = T6(),
          t7_cref t7 = T7(),
          t8_cref t8 = T8(),
          t9_cref t9 = T9(),
          t10_cref t10 = T10()
      ) :
        cons1(t1, cons2(t2, cons3(t3, cons4(t4, cons5(t5, cons6(t6,cons7(t7,cons8(t8,cons9(t9,cons10(t10))))))))))
      {
      }

      explicit tuple(t1_cref t1)
        : cons1(t1, cons2(T2(), cons3(T3(), cons4(T4(), cons5(T5(), cons6(T6(),cons7(T7(),cons8(T8(),cons9(T9(),cons10(T10()))))))))))
      {}

      template<typename Head, typename Tail>
      tuple(const cons<Head, Tail>& other) :
        cons1(other.head, other.tail)
      {
      }

      template<typename First, typename Second>
      self_type& operator=(const std::pair<First, Second>& other)
      {
        this->head = other.first;
        this->tail.head = other.second;
        return *this;
      }

      template<typename Head, typename Tail>
      self_type& operator=(const cons<Head, Tail>& other)
      {
        this->head = other.head;
        this->tail = other.tail;

        return *this;
      }
    };

    namespace detail {

      template<int N> struct workaround_holder {};

    } // namespace detail

    template<int N, typename Head, typename Tail>
    typename detail::element_ref<N, cons<Head, Tail> >::RET
    get(cons<Head, Tail>& t, detail::workaround_holder<N>* = 0)
    {
      return detail::get_class<N>::get(t);
    }

    template<int N, typename Head, typename Tail>
    typename detail::element_const_ref<N, cons<Head, Tail> >::RET
    get(const cons<Head, Tail>& t, detail::workaround_holder<N>* = 0)
    {
      return detail::get_class<N>::get(t);
    }

    // Make a tuple
    template<typename T1>
    inline
    tuple<T1>
    make_tuple(const T1& t1)
    {
      return tuple<T1>(t1);
    }

    // Make a tuple
    template<typename T1, typename T2>
    inline
    tuple<T1, T2>
    make_tuple(const T1& t1, const T2& t2)
    {
      return tuple<T1, T2>(t1, t2);
    }

    // Make a tuple
    template<typename T1, typename T2, typename T3>
    inline
    tuple<T1, T2, T3>
    make_tuple(const T1& t1, const T2& t2, const T3& t3)
    {
      return tuple<T1, T2, T3>(t1, t2, t3);
    }

    // Make a tuple
    template<typename T1, typename T2, typename T3, typename T4>
    inline
    tuple<T1, T2, T3, T4>
    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4)
    {
      return tuple<T1, T2, T3, T4>(t1, t2, t3, t4);
    }

    // Make a tuple
    template<typename T1, typename T2, typename T3, typename T4, typename T5>
    inline
    tuple<T1, T2, T3, T4, T5>
    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5)
    {
      return tuple<T1, T2, T3, T4, T5>(t1, t2, t3, t4, t5);
    }

    // Make a tuple
    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
    inline
    tuple<T1, T2, T3, T4, T5, T6>
    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6)
    {
      return tuple<T1, T2, T3, T4, T5, T6>(t1, t2, t3, t4, t5, t6);
    }

    // Make a tuple
    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
    inline
    tuple<T1, T2, T3, T4, T5, T6, T7>
    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7)
    {
      return tuple<T1, T2, T3, T4, T5, T6, T7>(t1, t2, t3, t4, t5, t6, t7);
    }

    // Make a tuple
    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
    inline
    tuple<T1, T2, T3, T4, T5, T6, T7, T8>
    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8)
    {
      return tuple<T1, T2, T3, T4, T5, T6, T7, T8>(t1, t2, t3, t4, t5, t6, t7, t8);
    }

    // Make a tuple
    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
    inline
    tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>
    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9)
    {
      return tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>(t1, t2, t3, t4, t5, t6, t7, t8, t9);
    }

    // Make a tuple
    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
    inline
    tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
    make_tuple(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5, const T6& t6, const T7& t7, const T8& t8, const T9& t9, const T10& t10)
    {
      return tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);
    }

    // Tie variables into a tuple
    template<typename T1>
    inline
    tuple<detail::assign_to_pointee<T1> >
    tie(T1& t1)
    {
      return make_tuple(detail::assign_to_pointee<T1>(&t1));
    }

    // Tie variables into a tuple
    template<typename T1, typename T2>
    inline
    tuple<detail::assign_to_pointee<T1>,
      detail::assign_to_pointee<T2> >
    tie(T1& t1, T2& t2)
    {
      return make_tuple(detail::assign_to_pointee<T1>(&t1),
                        detail::assign_to_pointee<T2>(&t2));
    }

    // Tie variables into a tuple
    template<typename T1, typename T2, typename T3>
    inline
    tuple<detail::assign_to_pointee<T1>,
      detail::assign_to_pointee<T2>,
      detail::assign_to_pointee<T3> >
    tie(T1& t1, T2& t2, T3& t3)
    {
      return make_tuple(detail::assign_to_pointee<T1>(&t1),
                        detail::assign_to_pointee<T2>(&t2),
                        detail::assign_to_pointee<T3>(&t3));
    }

    // Tie variables into a tuple
    template<typename T1, typename T2, typename T3, typename T4>
    inline
    tuple<detail::assign_to_pointee<T1>,
      detail::assign_to_pointee<T2>,
      detail::assign_to_pointee<T3>,
      detail::assign_to_pointee<T4> >
    tie(T1& t1, T2& t2, T3& t3, T4& t4)
    {
      return make_tuple(detail::assign_to_pointee<T1>(&t1),
                        detail::assign_to_pointee<T2>(&t2),
                        detail::assign_to_pointee<T3>(&t3),
                        detail::assign_to_pointee<T4>(&t4));
    }

    // Tie variables into a tuple
    template<typename T1, typename T2, typename T3, typename T4, typename T5>
    inline
    tuple<detail::assign_to_pointee<T1>,
      detail::assign_to_pointee<T2>,
      detail::assign_to_pointee<T3>,
      detail::assign_to_pointee<T4>,
      detail::assign_to_pointee<T5> >
    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5)
    {
      return make_tuple(detail::assign_to_pointee<T1>(&t1),
                        detail::assign_to_pointee<T2>(&t2),
                        detail::assign_to_pointee<T3>(&t3),
                        detail::assign_to_pointee<T4>(&t4),
                        detail::assign_to_pointee<T5>(&t5));
    }

    // Tie variables into a tuple
    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
    inline
    tuple<detail::assign_to_pointee<T1>,
      detail::assign_to_pointee<T2>,
      detail::assign_to_pointee<T3>,
      detail::assign_to_pointee<T4>,
      detail::assign_to_pointee<T5>,
      detail::assign_to_pointee<T6> >
    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6)
    {
      return make_tuple(detail::assign_to_pointee<T1>(&t1),
                        detail::assign_to_pointee<T2>(&t2),
                        detail::assign_to_pointee<T3>(&t3),
                        detail::assign_to_pointee<T4>(&t4),
                        detail::assign_to_pointee<T5>(&t5),
                        detail::assign_to_pointee<T6>(&t6));
    }

    // Tie variables into a tuple
    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
    inline
    tuple<detail::assign_to_pointee<T1>,
      detail::assign_to_pointee<T2>,
      detail::assign_to_pointee<T3>,
      detail::assign_to_pointee<T4>,
      detail::assign_to_pointee<T5>,
      detail::assign_to_pointee<T6>,
      detail::assign_to_pointee<T7> >
    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7)
    {
      return make_tuple(detail::assign_to_pointee<T1>(&t1),
                        detail::assign_to_pointee<T2>(&t2),
                        detail::assign_to_pointee<T3>(&t3),
                        detail::assign_to_pointee<T4>(&t4),
                        detail::assign_to_pointee<T5>(&t5),
                        detail::assign_to_pointee<T6>(&t6),
                        detail::assign_to_pointee<T7>(&t7));
    }

    // Tie variables into a tuple
    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
    inline
    tuple<detail::assign_to_pointee<T1>,
      detail::assign_to_pointee<T2>,
      detail::assign_to_pointee<T3>,
      detail::assign_to_pointee<T4>,
      detail::assign_to_pointee<T5>,
      detail::assign_to_pointee<T6>,
      detail::assign_to_pointee<T7>,
      detail::assign_to_pointee<T8> >
    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8)
    {
      return make_tuple(detail::assign_to_pointee<T1>(&t1),
                        detail::assign_to_pointee<T2>(&t2),
                        detail::assign_to_pointee<T3>(&t3),
                        detail::assign_to_pointee<T4>(&t4),
                        detail::assign_to_pointee<T5>(&t5),
                        detail::assign_to_pointee<T6>(&t6),
                        detail::assign_to_pointee<T7>(&t7),
                        detail::assign_to_pointee<T8>(&t8));
    }

    // Tie variables into a tuple
    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
    inline
    tuple<detail::assign_to_pointee<T1>,
      detail::assign_to_pointee<T2>,
      detail::assign_to_pointee<T3>,
      detail::assign_to_pointee<T4>,
      detail::assign_to_pointee<T5>,
      detail::assign_to_pointee<T6>,
      detail::assign_to_pointee<T7>,
      detail::assign_to_pointee<T8>,
      detail::assign_to_pointee<T9> >
    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8, T9 &t9)
    {
      return make_tuple(detail::assign_to_pointee<T1>(&t1),
                        detail::assign_to_pointee<T2>(&t2),
                        detail::assign_to_pointee<T3>(&t3),
                        detail::assign_to_pointee<T4>(&t4),
                        detail::assign_to_pointee<T5>(&t5),
                        detail::assign_to_pointee<T6>(&t6),
                        detail::assign_to_pointee<T7>(&t7),
                        detail::assign_to_pointee<T8>(&t8),
                        detail::assign_to_pointee<T9>(&t9));
    }
    // Tie variables into a tuple
    template<typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
    inline
    tuple<detail::assign_to_pointee<T1>,
      detail::assign_to_pointee<T2>,
      detail::assign_to_pointee<T3>,
      detail::assign_to_pointee<T4>,
      detail::assign_to_pointee<T5>,
      detail::assign_to_pointee<T6>,
      detail::assign_to_pointee<T7>,
      detail::assign_to_pointee<T8>,
      detail::assign_to_pointee<T9>,
      detail::assign_to_pointee<T10> >
    tie(T1& t1, T2& t2, T3& t3, T4& t4, T5 &t5, T6 &t6, T7 &t7, T8 &t8, T9 &t9, T10 &t10)
    {
      return make_tuple(detail::assign_to_pointee<T1>(&t1),
                        detail::assign_to_pointee<T2>(&t2),
                        detail::assign_to_pointee<T3>(&t3),
                        detail::assign_to_pointee<T4>(&t4),
                        detail::assign_to_pointee<T5>(&t5),
                        detail::assign_to_pointee<T6>(&t6),
                        detail::assign_to_pointee<T7>(&t7),
                        detail::assign_to_pointee<T8>(&t8),
                        detail::assign_to_pointee<T9>(&t9),
                        detail::assign_to_pointee<T10>(&t10));
    }
    // "ignore" allows tuple positions to be ignored when using "tie".

detail::swallow_assign const ignore = detail::swallow_assign();

} // namespace tuples
} // namespace boost
#endif // BOOST_TUPLE_BASIC_NO_PARTIAL_SPEC_HPP

⌨️ 快捷键说明

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