📄 tuple_basic_no_partial_spec.hpp
字号:
{ 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 + -