From 4914be80995ec0e2d620da070f9301e7c29b4582 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Thu, 4 Mar 2021 18:37:07 +0300 Subject: [PATCH] Proper sfinae for vector & point constructors instead of static_assert --- libs/geom/include/psemek/geom/detail/array.hpp | 15 +++++++++++++++ libs/geom/include/psemek/geom/point.hpp | 6 ++---- libs/geom/include/psemek/geom/vector.hpp | 6 ++---- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/libs/geom/include/psemek/geom/detail/array.hpp b/libs/geom/include/psemek/geom/detail/array.hpp index 53cf4895..3e451546 100644 --- a/libs/geom/include/psemek/geom/detail/array.hpp +++ b/libs/geom/include/psemek/geom/detail/array.hpp @@ -32,4 +32,19 @@ namespace psemek::geom::detail }; }; + template + struct all_convertible_to; + + + template + struct all_convertible_to + : std::true_type + {}; + + template + struct all_convertible_to + : std::bool_constant + && all_convertible_to::value> + {}; + } diff --git a/libs/geom/include/psemek/geom/point.hpp b/libs/geom/include/psemek/geom/point.hpp index 2bce6b0b..253ad190 100644 --- a/libs/geom/include/psemek/geom/point.hpp +++ b/libs/geom/include/psemek/geom/point.hpp @@ -24,12 +24,10 @@ namespace psemek::geom point & operator = (point &) = default; point & operator = (point &&) = default; - template + template ::value>> point(Args && ... args) : coords{ static_cast(std::forward(args))... } - { - static_assert(sizeof...(Args) == N); - } + {} std::size_t dimension() const { diff --git a/libs/geom/include/psemek/geom/vector.hpp b/libs/geom/include/psemek/geom/vector.hpp index bb20a72b..0e9681f3 100644 --- a/libs/geom/include/psemek/geom/vector.hpp +++ b/libs/geom/include/psemek/geom/vector.hpp @@ -29,12 +29,10 @@ namespace psemek::geom vector & operator = (vector &) = default; vector & operator = (vector &&) = default; - template + template ::value>> vector(Args && ... args) : coords{ static_cast(std::forward(args))... } - { - static_assert(sizeof...(Args) == N); - } + {} std::size_t dimension() const {