Example #1
0
    namespace boost { namespace proto
    {
        namespace detail
        {
            template<typename T> T make();

            template<typename T>
            char check_reference(T &);

            template<typename T>
            char (&check_reference(T const &))[2];

            template<typename A0, typename A1>
            struct comma_result
            {
                BOOST_PROTO_DECLTYPE_((detail::make<A0>(), detail::make<A1>()), type)
            };

            template<typename A0>
            struct comma_result<A0, void>
            {
                typedef void type;
            };

            template<typename A1>
            struct comma_result<void, A1>
            {
                typedef A1 type;
            };

            template<>
    #define UNREF(x) typename boost::remove_reference<x>::type

        namespace detail
        {
            template<typename T> T make();

            template<typename T>
            char check_reference(T &);

            template<typename T>
            char (&check_reference(T const &))[2];

            template<typename A0, typename A1>
            struct comma_result
            {
                BOOST_PROTO_DECLTYPE_((proto::detail::make<A0>(), proto::detail::make<A1>()), type)
            };

            template<typename A0>
            struct comma_result<A0, void>
            {
                typedef void type;
            };

            template<typename A1>
            struct comma_result<void, A1>
            {
                typedef A1 type;
            };

            template<>