namespace boost { namespace yap { template<expr_kind Kind, typename Tuple> struct expression; template<typename T> struct expression<expr_kind::terminal, hana::tuple< T >>; template<typename Expr> constexpr auto operator+(Expr &&); template<typename Expr> constexpr auto operator-(Expr &&); template<typename Expr> constexpr auto operator*(Expr &&); template<typename Expr> constexpr auto operator~(Expr &&); template<typename Expr> constexpr auto operator&(Expr &&); template<typename Expr> constexpr auto operator!(Expr &&); template<typename Expr> constexpr auto operator++(Expr &&); template<typename Expr> constexpr auto operator--(Expr &&); template<typename Expr> constexpr auto operator++(Expr &&, int); template<typename Expr> constexpr auto operator--(Expr &&, int); template<typename LExpr, typename RExpr> constexpr auto operator<<(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator>>(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator*(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator/(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator%(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator+(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator-(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator<(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator>(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator<=(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator>=(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator==(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator!=(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator||(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator&&(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator&(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator|(LExpr &&, RExpr &&); template<typename LExpr, typename RExpr> constexpr auto operator^(LExpr &&, RExpr &&); template<typename Expr1, typename Expr2, typename Expr3> constexpr auto if_else(Expr1 &&, Expr2 &&, Expr3 &&); template<expr_kind Kind, typename... T> constexpr auto make_expression(T &&...); template<typename T> constexpr auto make_terminal(T &&); template<typename T> decltype(auto) constexpr as_expr(T &&); } }