diff --git a/include/boost/geometry/algorithms/area_result.hpp b/include/boost/geometry/algorithms/area_result.hpp index 5fa2249d7b..3d896f024f 100644 --- a/include/boost/geometry/algorithms/area_result.hpp +++ b/include/boost/geometry/algorithms/area_result.hpp @@ -143,14 +143,14 @@ struct area_result : detail::area::area_result {}; -template -struct area_result, Strategy> +template +struct area_result, Strategy> : geometry::area_result < typename util::select_pack_element < detail::area::more_precise_coordinate_type, - Ts... + BOOST_VARIANT_ENUM_PARAMS(T) >::type, Strategy > @@ -161,14 +161,14 @@ struct area_result : detail::area::default_area_result {}; -template -struct area_result, default_strategy> +template +struct area_result, default_strategy> : detail::area::default_area_result < typename util::select_pack_element < detail::area::more_precise_default_area_result, - Ts... + BOOST_VARIANT_ENUM_PARAMS(T) >::type > {}; diff --git a/include/boost/geometry/geometries/point.hpp b/include/boost/geometry/geometries/point.hpp index 19bd0b26cb..4b38995343 100644 --- a/include/boost/geometry/geometries/point.hpp +++ b/include/boost/geometry/geometries/point.hpp @@ -82,6 +82,11 @@ class point // passed for non-Cartesian coordinate systems. enum { cs_check = sizeof(CoordinateSystem) }; + template + struct enable_ctor_if + : std::enable_if + {}; + public: // TODO: constexpr requires LiteralType and until C++20 @@ -124,6 +129,11 @@ class point } /// @brief Constructor to set two values + template + < + typename T = CoordinateType, + typename enable_ctor_if= 2), int>::type = 0 + > #if ! defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) constexpr #endif @@ -137,6 +147,11 @@ class point } /// @brief Constructor to set three values + template + < + typename T = CoordinateType, + typename enable_ctor_if= 3), int>::type = 0 + > #if ! defined(BOOST_GEOMETRY_ENABLE_ACCESS_DEBUGGING) constexpr #endif diff --git a/include/boost/geometry/geometries/variant.hpp b/include/boost/geometry/geometries/variant.hpp index 0d04cc6310..1992a6622c 100644 --- a/include/boost/geometry/geometries/variant.hpp +++ b/include/boost/geometry/geometries/variant.hpp @@ -27,10 +27,30 @@ namespace boost { namespace geometry { +namespace detail +{ + +template +struct parameter_pack_first_type {}; + +template +struct parameter_pack_first_type +{ + typedef T type; +}; + +} // namespace detail + -template -struct point_type > - : point_type +template +struct point_type > + : point_type + < + typename detail::parameter_pack_first_type + < + BOOST_VARIANT_ENUM_PARAMS(T) + >::type + > {}; diff --git a/include/boost/geometry/srs/projections/dpar.hpp b/include/boost/geometry/srs/projections/dpar.hpp index 3140b7e95e..18a0971a1e 100644 --- a/include/boost/geometry/srs/projections/dpar.hpp +++ b/include/boost/geometry/srs/projections/dpar.hpp @@ -65,9 +65,9 @@ template struct find_type_index {}; -template -struct find_type_index, T> - : find_type_index_impl +template +struct find_type_index, T> + : find_type_index_impl {}; diff --git a/include/boost/geometry/strategies/comparable_distance_result.hpp b/include/boost/geometry/strategies/comparable_distance_result.hpp index 54ad20384c..811d6bab58 100644 --- a/include/boost/geometry/strategies/comparable_distance_result.hpp +++ b/include/boost/geometry/strategies/comparable_distance_result.hpp @@ -132,8 +132,16 @@ struct comparable_distance_result {}; -template -struct comparable_distance_result, Strategy> +template +< + typename Geometry1, + BOOST_VARIANT_ENUM_PARAMS(typename T), + typename Strategy +> +struct comparable_distance_result + < + Geometry1, boost::variant, Strategy + > { // Select the most precise distance strategy result type // for all variant type combinations. @@ -142,7 +150,7 @@ struct comparable_distance_result, Strategy> typedef typename util::select_combination_element < util::type_sequence, - util::type_sequence, + util::type_sequence, detail::distance::more_precise_comparable_distance_result < Strategy @@ -159,19 +167,34 @@ struct comparable_distance_result, Strategy> // Distance arguments are commutative -template -struct comparable_distance_result, Geometry2, Strategy> +template +< + BOOST_VARIANT_ENUM_PARAMS(typename T), + typename Geometry2, + typename Strategy +> +struct comparable_distance_result + < + boost::variant, Geometry2, Strategy + > : public comparable_distance_result < - Geometry2, boost::variant, Strategy + Geometry2, boost::variant, Strategy > {}; -template +template +< + BOOST_VARIANT_ENUM_PARAMS(typename T), + BOOST_VARIANT_ENUM_PARAMS(typename U), + typename Strategy +> struct comparable_distance_result < - boost::variant, boost::variant, Strategy + boost::variant, + boost::variant, + Strategy > { // Select the most precise distance strategy result type @@ -180,8 +203,8 @@ struct comparable_distance_result // but is_implemented is not ready for prime time. typedef typename util::select_combination_element < - util::type_sequence, - util::type_sequence, + util::type_sequence, + util::type_sequence, detail::distance::more_precise_comparable_distance_result < Strategy diff --git a/include/boost/geometry/strategies/default_length_result.hpp b/include/boost/geometry/strategies/default_length_result.hpp index 5f3d439c0f..91747a3576 100644 --- a/include/boost/geometry/strategies/default_length_result.hpp +++ b/include/boost/geometry/strategies/default_length_result.hpp @@ -79,9 +79,9 @@ struct default_length_result : resolve_strategy::default_length_result {}; -template -struct default_length_result > - : resolve_strategy::default_length_result +template +struct default_length_result > + : resolve_strategy::default_length_result {}; } // namespace resolve_variant diff --git a/include/boost/geometry/strategies/distance_result.hpp b/include/boost/geometry/strategies/distance_result.hpp index 45edda9448..17ac47f133 100644 --- a/include/boost/geometry/strategies/distance_result.hpp +++ b/include/boost/geometry/strategies/distance_result.hpp @@ -140,8 +140,16 @@ struct distance_result {}; -template -struct distance_result, Strategy> +template +< + typename Geometry1, + BOOST_VARIANT_ENUM_PARAMS(typename T), + typename Strategy +> +struct distance_result + < + Geometry1, boost::variant, Strategy + > { // Select the most precise distance strategy result type // for all variant type combinations. @@ -150,7 +158,7 @@ struct distance_result, Strategy> typedef typename util::select_combination_element < util::type_sequence, - util::type_sequence, + util::type_sequence, detail::distance::more_precise_distance_result::template predicate >::type elements; @@ -164,14 +172,35 @@ struct distance_result, Strategy> // Distance arguments are commutative -template -struct distance_result, Geometry2, Strategy> - : public distance_result, Strategy> +template +< + BOOST_VARIANT_ENUM_PARAMS(typename T), + typename Geometry2, + typename Strategy +> +struct distance_result + < + boost::variant, Geometry2, Strategy + > + : public distance_result + < + Geometry2, boost::variant, Strategy + > {}; -template -struct distance_result, boost::variant, Strategy> +template +< + BOOST_VARIANT_ENUM_PARAMS(typename T), + BOOST_VARIANT_ENUM_PARAMS(typename U), + typename Strategy +> +struct distance_result + < + boost::variant, + boost::variant, + Strategy + > { // Select the most precise distance strategy result type // for all variant type combinations. @@ -179,8 +208,8 @@ struct distance_result, boost::variant, Strategy> // but is_implemented is not ready for prime time. typedef typename util::select_combination_element < - util::type_sequence, - util::type_sequence, + util::type_sequence, + util::type_sequence, detail::distance::more_precise_distance_result::template predicate >::type elements;