From 7fe8e2cfdc7aeac9565abb6ee4904f31df99945f Mon Sep 17 00:00:00 2001 From: ipknHama Date: Fri, 20 Feb 2015 10:53:43 +0900 Subject: change SFINAE mechanics to support VS2013 --- include/http_connection.h | 96 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 84 insertions(+), 12 deletions(-) (limited to 'include') diff --git a/include/http_connection.h b/include/http_connection.h index 212f1cd..d9ccb21 100644 --- a/include/http_connection.h +++ b/include/http_connection.h @@ -21,32 +21,104 @@ namespace crow { namespace detail { + template + struct check_before_handle_arity_3_const + { + template + struct get + { }; + }; + + template + struct check_before_handle_arity_3 + { + template + struct get + { }; + }; + + template + struct check_after_handle_arity_3_const + { + template + struct get + { }; + }; + + template + struct check_after_handle_arity_3 + { + template + struct get + { }; + }; + + template + struct is_before_handle_arity_3_impl + { + template + static std::true_type f(typename check_before_handle_arity_3_const::template get*); + + template + static std::true_type f(typename check_before_handle_arity_3::template get*); + + template + static std::false_type f(...); + + public: + static const bool value = decltype(f(nullptr))::value; + }; + + template + struct is_after_handle_arity_3_impl + { + template + static std::true_type f(typename check_after_handle_arity_3_const::template get*); + + template + static std::true_type f(typename check_after_handle_arity_3::template get*); + + template + static std::false_type f(...); + + public: + static const bool value = decltype(f(nullptr))::value; + }; + template - void before_handler_call(MW& mw, request& req, response& res, Context& ctx, ParentContext& parent_ctx, - decltype(std::declval().before_handle(std::declval(), std::declval(), std::declval()))* dummy = 0) + typename std::enable_if::value>::type + before_handler_call(MW& mw, request& req, response& res, Context& ctx, ParentContext& parent_ctx) { - mw.before_handle(req, res, ctx.template get()); + mw.before_handle(req, res, ctx.template get(), ctx); } template - void before_handler_call(MW& mw, request& req, response& res, Context& ctx, ParentContext& parent_ctx, - decltype(std::declval().before_handle(std::declval(), std::declval(), std::declval(), std::declval))* dummy = 0) + typename std::enable_if::value>::type + before_handler_call(MW& mw, request& req, response& res, Context& ctx, ParentContext& parent_ctx) { - mw.before_handle(req, res, ctx.template get(), parent_ctx); + mw.before_handle(req, res, ctx.template get()); } template - void after_handler_call(MW& mw, request& req, response& res, Context& ctx, ParentContext& parent_ctx, - decltype(std::declval().before_handle(std::declval(), std::declval(), std::declval()))* dummy = 0) + typename std::enable_if::value>::type + after_handler_call(MW& mw, request& req, response& res, Context& ctx, ParentContext& parent_ctx) { - mw.after_handle(req, res, ctx.template get()); + mw.after_handle(req, res, ctx.template get(), ctx); } template - void after_handler_call(MW& mw, request& req, response& res, Context& ctx, ParentContext& parent_ctx, - decltype(std::declval().before_handle(std::declval(), std::declval(), std::declval(), std::declval))* dummy = 0) + typename std::enable_if::value>::type + after_handler_call(MW& mw, request& req, response& res, Context& ctx, ParentContext& parent_ctx) { - mw.after_handle(req, res, ctx.template get(), parent_ctx); + mw.after_handle(req, res, ctx.template get()); } template -- cgit v1.2.3-54-g00ecf