diff --git a/BGL/include/CGAL/boost/graph/Named_function_parameters.h b/BGL/include/CGAL/boost/graph/Named_function_parameters.h index c1858ac0198..c007da67960 100644 --- a/BGL/include/CGAL/boost/graph/Named_function_parameters.h +++ b/BGL/include/CGAL/boost/graph/Named_function_parameters.h @@ -16,6 +16,7 @@ #include #include +#include #define CGAL_BGL_NP_TEMPLATE_PARAMETERS T, typename Tag, typename Base #define CGAL_BGL_NP_CLASS CGAL::Named_function_parameters @@ -38,8 +39,9 @@ enum all_default_t { all_default }; template struct Named_params_impl : Base { - T v; // copy of the parameter - Named_params_impl(T v, const Base& b) + typename std::conditional::value, + T, std::reference_wrapper >::type v; // copy of the parameter if copyable + Named_params_impl(const T& v, const Base& b) : Base(b) , v(v) {} @@ -49,8 +51,9 @@ struct Named_params_impl : Base template struct Named_params_impl { - T v; // copy of the parameter - Named_params_impl(T v) + typename std::conditional::value, + T, std::reference_wrapper >::type v; // copy of the parameter if copyable + Named_params_impl(const T& v) : v(v) {} }; @@ -68,13 +71,15 @@ struct Get_param< Named_params_impl, Query_tag > template< typename T, typename Tag, typename Base> struct Get_param< Named_params_impl, Tag > { - typedef T type; + typedef typename std::conditional::value, + T, std::reference_wrapper >::type type; }; template< typename T, typename Tag> struct Get_param< Named_params_impl, Tag > { - typedef T type; + typedef typename std::conditional::value, + T, std::reference_wrapper >::type type; }; @@ -98,7 +103,9 @@ struct Lookup_named_param_def // helper function to extract the value from a named parameter pack given a query tag template -T get_parameter_impl(const Named_params_impl& np, Tag) +typename std::conditional::value, + T, std::reference_wrapper >::type +get_parameter_impl(const Named_params_impl& np, Tag) { return np.v; } @@ -110,7 +117,9 @@ Param_not_found get_parameter_impl(const Named_params_impl& } template< typename T, typename Tag> -T get_parameter_impl(const Named_params_impl& np, Tag) +typename std::conditional::value, + T, std::reference_wrapper >::type +get_parameter_impl(const Named_params_impl& np, Tag) { return np.v; }; @@ -133,8 +142,9 @@ struct Named_function_parameters typedef internal_np::Named_params_impl base; typedef Named_function_parameters self; - Named_function_parameters(T v = T()) : base(v) {} - Named_function_parameters(T v, const Base& b) : base(v, b) {} + Named_function_parameters() : base(T()) {} + Named_function_parameters(const T& v) : base(v) {} + Named_function_parameters(const T& v, const Base& b) : base(v, b) {} Named_function_parameters all_default() const @@ -178,7 +188,7 @@ inline no_parameters(Named_function_parameters) #define CGAL_add_named_parameter(X, Y, Z) \ template \ Named_function_parameters \ - Z(K const& p) \ + Z(const K& p) \ { \ typedef Named_function_parameters Params;\ return Params(p); \