/////////////////////////////////////////////////////////////////////////////// /// \file traits.hpp /// Definitions of proto::function, proto::nary_expr and proto::result_of::child_c // // Copyright 2008 Eric Niebler. Distributed under the Boost // Software License, Version 1.0. (See accompanying file // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) namespace result_of { template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child0 value_type; typedef typename detail::expr_traits::value_type type; }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child0 value_type; typedef typename detail::expr_traits::reference type; BOOST_FORCEINLINE static type call(Expr &e) { return e.proto_base().child0; } }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child0 value_type; typedef typename detail::expr_traits::const_reference type; BOOST_FORCEINLINE static type call(Expr const &e) { return e.proto_base().child0; } }; } template struct function < A0 , void , void , void , void , void , void , void , void , void > : proto::transform< function< A0 , void , void , void , void , void , void , void , void , void > , int > { typedef proto::expr, 1> type; typedef proto::basic_expr, 1> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef proto::tag::function proto_tag; typedef A0 proto_child0; typedef detail::if_vararg proto_child1; typedef detail::if_vararg proto_child2; typedef detail::if_vararg proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; template struct nary_expr < Tag , A0 , void , void , void , void , void , void , void , void , void > : proto::transform< nary_expr< Tag , A0 , void , void , void , void , void , void , void , void , void > , int > { typedef proto::expr, 1> type; typedef proto::basic_expr, 1> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef Tag proto_tag; typedef A0 proto_child0; typedef detail::if_vararg proto_child1; typedef detail::if_vararg proto_child2; typedef detail::if_vararg proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; namespace detail { template< template class T , typename A0 > struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)> : is_same {}; } namespace result_of { template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child1 value_type; typedef typename detail::expr_traits::value_type type; }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child1 value_type; typedef typename detail::expr_traits::reference type; BOOST_FORCEINLINE static type call(Expr &e) { return e.proto_base().child1; } }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child1 value_type; typedef typename detail::expr_traits::const_reference type; BOOST_FORCEINLINE static type call(Expr const &e) { return e.proto_base().child1; } }; } template struct function < A0 , A1 , void , void , void , void , void , void , void , void > : proto::transform< function< A0 , A1 , void , void , void , void , void , void , void , void > , int > { typedef proto::expr, 2> type; typedef proto::basic_expr, 2> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef proto::tag::function proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef detail::if_vararg proto_child2; typedef detail::if_vararg proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; template struct nary_expr < Tag , A0 , A1 , void , void , void , void , void , void , void , void > : proto::transform< nary_expr< Tag , A0 , A1 , void , void , void , void , void , void , void , void > , int > { typedef proto::expr, 2> type; typedef proto::basic_expr, 2> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef Tag proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef detail::if_vararg proto_child2; typedef detail::if_vararg proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; namespace detail { template< template class T , typename A0 , typename A1 > struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(2)> : is_same {}; } namespace result_of { template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child2 value_type; typedef typename detail::expr_traits::value_type type; }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child2 value_type; typedef typename detail::expr_traits::reference type; BOOST_FORCEINLINE static type call(Expr &e) { return e.proto_base().child2; } }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child2 value_type; typedef typename detail::expr_traits::const_reference type; BOOST_FORCEINLINE static type call(Expr const &e) { return e.proto_base().child2; } }; } template struct function < A0 , A1 , A2 , void , void , void , void , void , void , void > : proto::transform< function< A0 , A1 , A2 , void , void , void , void , void , void , void > , int > { typedef proto::expr, 3> type; typedef proto::basic_expr, 3> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef proto::tag::function proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef detail::if_vararg proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; template struct nary_expr < Tag , A0 , A1 , A2 , void , void , void , void , void , void , void > : proto::transform< nary_expr< Tag , A0 , A1 , A2 , void , void , void , void , void , void , void > , int > { typedef proto::expr, 3> type; typedef proto::basic_expr, 3> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef Tag proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef detail::if_vararg proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; namespace detail { template< template class T , typename A0 , typename A1 , typename A2 > struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(3)> : is_same {}; } namespace result_of { template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child3 value_type; typedef typename detail::expr_traits::value_type type; }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child3 value_type; typedef typename detail::expr_traits::reference type; BOOST_FORCEINLINE static type call(Expr &e) { return e.proto_base().child3; } }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child3 value_type; typedef typename detail::expr_traits::const_reference type; BOOST_FORCEINLINE static type call(Expr const &e) { return e.proto_base().child3; } }; } template struct function < A0 , A1 , A2 , A3 , void , void , void , void , void , void > : proto::transform< function< A0 , A1 , A2 , A3 , void , void , void , void , void , void > , int > { typedef proto::expr, 4> type; typedef proto::basic_expr, 4> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef proto::tag::function proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; template struct nary_expr < Tag , A0 , A1 , A2 , A3 , void , void , void , void , void , void > : proto::transform< nary_expr< Tag , A0 , A1 , A2 , A3 , void , void , void , void , void , void > , int > { typedef proto::expr, 4> type; typedef proto::basic_expr, 4> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef Tag proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; namespace detail { template< template class T , typename A0 , typename A1 , typename A2 , typename A3 > struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(4)> : is_same {}; } namespace result_of { template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child4 value_type; typedef typename detail::expr_traits::value_type type; }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child4 value_type; typedef typename detail::expr_traits::reference type; BOOST_FORCEINLINE static type call(Expr &e) { return e.proto_base().child4; } }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child4 value_type; typedef typename detail::expr_traits::const_reference type; BOOST_FORCEINLINE static type call(Expr const &e) { return e.proto_base().child4; } }; } template struct function < A0 , A1 , A2 , A3 , A4 , void , void , void , void , void > : proto::transform< function< A0 , A1 , A2 , A3 , A4 , void , void , void , void , void > , int > { typedef proto::expr, 5> type; typedef proto::basic_expr, 5> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef proto::tag::function proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; template struct nary_expr < Tag , A0 , A1 , A2 , A3 , A4 , void , void , void , void , void > : proto::transform< nary_expr< Tag , A0 , A1 , A2 , A3 , A4 , void , void , void , void , void > , int > { typedef proto::expr, 5> type; typedef proto::basic_expr, 5> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef Tag proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; namespace detail { template< template class T , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 > struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(5)> : is_same {}; } namespace result_of { template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child5 value_type; typedef typename detail::expr_traits::value_type type; }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child5 value_type; typedef typename detail::expr_traits::reference type; BOOST_FORCEINLINE static type call(Expr &e) { return e.proto_base().child5; } }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child5 value_type; typedef typename detail::expr_traits::const_reference type; BOOST_FORCEINLINE static type call(Expr const &e) { return e.proto_base().child5; } }; } template struct function < A0 , A1 , A2 , A3 , A4 , A5 , void , void , void , void > : proto::transform< function< A0 , A1 , A2 , A3 , A4 , A5 , void , void , void , void > , int > { typedef proto::expr, 6> type; typedef proto::basic_expr, 6> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef proto::tag::function proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; template struct nary_expr < Tag , A0 , A1 , A2 , A3 , A4 , A5 , void , void , void , void > : proto::transform< nary_expr< Tag , A0 , A1 , A2 , A3 , A4 , A5 , void , void , void , void > , int > { typedef proto::expr, 6> type; typedef proto::basic_expr, 6> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef Tag proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; namespace detail { template< template class T , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 > struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(6)> : is_same {}; } namespace result_of { template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child6 value_type; typedef typename detail::expr_traits::value_type type; }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child6 value_type; typedef typename detail::expr_traits::reference type; BOOST_FORCEINLINE static type call(Expr &e) { return e.proto_base().child6; } }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child6 value_type; typedef typename detail::expr_traits::const_reference type; BOOST_FORCEINLINE static type call(Expr const &e) { return e.proto_base().child6; } }; } template struct function < A0 , A1 , A2 , A3 , A4 , A5 , A6 , void , void , void > : proto::transform< function< A0 , A1 , A2 , A3 , A4 , A5 , A6 , void , void , void > , int > { typedef proto::expr, 7> type; typedef proto::basic_expr, 7> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef proto::tag::function proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; template struct nary_expr < Tag , A0 , A1 , A2 , A3 , A4 , A5 , A6 , void , void , void > : proto::transform< nary_expr< Tag , A0 , A1 , A2 , A3 , A4 , A5 , A6 , void , void , void > , int > { typedef proto::expr, 7> type; typedef proto::basic_expr, 7> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef Tag proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; namespace detail { template< template class T , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 > struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(7)> : is_same {}; } namespace result_of { template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child7 value_type; typedef typename detail::expr_traits::value_type type; }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child7 value_type; typedef typename detail::expr_traits::reference type; BOOST_FORCEINLINE static type call(Expr &e) { return e.proto_base().child7; } }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child7 value_type; typedef typename detail::expr_traits::const_reference type; BOOST_FORCEINLINE static type call(Expr const &e) { return e.proto_base().child7; } }; } template struct function < A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , void , void > : proto::transform< function< A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , void , void > , int > { typedef proto::expr, 8> type; typedef proto::basic_expr, 8> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef proto::tag::function proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; template struct nary_expr < Tag , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , void , void > : proto::transform< nary_expr< Tag , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , void , void > , int > { typedef proto::expr, 8> type; typedef proto::basic_expr, 8> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef Tag proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; }; namespace detail { template< template class T , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 > struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(8)> : is_same {}; } namespace result_of { template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child8 value_type; typedef typename detail::expr_traits::value_type type; }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child8 value_type; typedef typename detail::expr_traits::reference type; BOOST_FORCEINLINE static type call(Expr &e) { return e.proto_base().child8; } }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child8 value_type; typedef typename detail::expr_traits::const_reference type; BOOST_FORCEINLINE static type call(Expr const &e) { return e.proto_base().child8; } }; } template struct function < A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , void > : proto::transform< function< A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , void > , int > { typedef proto::expr, 9> type; typedef proto::basic_expr, 9> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef proto::tag::function proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef A8 proto_child8; typedef detail::if_vararg proto_child9; }; template struct nary_expr < Tag , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , void > : proto::transform< nary_expr< Tag , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , void > , int > { typedef proto::expr, 9> type; typedef proto::basic_expr, 9> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef Tag proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef A8 proto_child8; typedef detail::if_vararg proto_child9; }; namespace detail { template< template class T , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 > struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(9)> : is_same {}; } namespace result_of { template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child9 value_type; typedef typename detail::expr_traits::value_type type; }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child9 value_type; typedef typename detail::expr_traits::reference type; BOOST_FORCEINLINE static type call(Expr &e) { return e.proto_base().child9; } }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child9 value_type; typedef typename detail::expr_traits::const_reference type; BOOST_FORCEINLINE static type call(Expr const &e) { return e.proto_base().child9; } }; } template struct function : proto::transform< function< A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9 > , int > { typedef proto::expr, 10> type; typedef proto::basic_expr, 10> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef proto::tag::function proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef A8 proto_child8; typedef A9 proto_child9; }; template struct nary_expr : proto::transform< nary_expr< Tag , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9 > , int > { typedef proto::expr, 10> type; typedef proto::basic_expr, 10> proto_grammar; template struct impl : detail::pass_through_impl {}; typedef Tag proto_tag; typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef A8 proto_child8; typedef A9 proto_child9; }; namespace detail { template< template class T , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 > struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(10)> : is_same {}; } namespace result_of { template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child10 value_type; typedef typename detail::expr_traits::value_type type; }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child10 value_type; typedef typename detail::expr_traits::reference type; BOOST_FORCEINLINE static type call(Expr &e) { return e.proto_base().child10; } }; template struct child_c { BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); typedef typename Expr::proto_child10 value_type; typedef typename detail::expr_traits::const_reference type; BOOST_FORCEINLINE static type call(Expr const &e) { return e.proto_base().child10; } }; }