diff --git a/src/OpenMesh/Core/Mesh/SmartRange.hh b/src/OpenMesh/Core/Mesh/SmartRange.hh index 24b12f39..06e5192b 100644 --- a/src/OpenMesh/Core/Mesh/SmartRange.hh +++ b/src/OpenMesh/Core/Mesh/SmartRange.hh @@ -78,18 +78,18 @@ struct SmartRangeT * @param f Functor that is applied to all elements before computing the sum */ template - auto sum(Functor&& f) -> decltype (f(std::declval())+f(std::declval())) + auto sum(Functor&& f) -> typename std::decay()))>::type { auto range = static_cast(this); auto begin = range->begin(); auto end = range->end(); assert(begin != end); - decltype (f(*begin) + f(*begin)) sum = f(*begin); + typename std::decay::type result = f(*begin); auto it = begin; ++it; for (; it != end; ++it) - sum += f(*it); - return sum; + result += f(*it); + return result; } /** @brief Computes the average of elements. @@ -99,22 +99,22 @@ struct SmartRangeT * @param f Functor that is applied to all elements before computing the average. */ template - auto avg(Functor&& f) -> decltype (1.0 * (f(std::declval())+f(std::declval()))) + auto avg(Functor&& f) -> typename std::decay()))>::type { auto range = static_cast(this); auto begin = range->begin(); auto end = range->end(); assert(begin != end); - decltype (f(*begin) + f(*begin)) sum = f(*begin); + typename std::decay::type result = f(*begin); auto it = begin; ++it; int n_elements = 1; for (; it != end; ++it) { - sum += f(*it); + result += f(*it); ++n_elements; } - return (1.0 / n_elements) * sum; + return (1.0 / n_elements) * result; } /** @brief Check if any element fulfils condition. @@ -161,10 +161,10 @@ struct SmartRangeT * the array will contain the handles. */ template - auto to_array(Functor&& f = {}) -> std::array()))>::type, n> + auto to_array(Functor&& f = {}) -> std::array()))>::type, n> { auto range = static_cast(this); - std::array()))>::type, n> res; + std::array()))>::type, n> res; auto it = range->begin(); auto end = range->end(); int i = 0; @@ -181,10 +181,10 @@ struct SmartRangeT * the vector will contain the handles. */ template - auto to_vector(Functor&& f = {}) -> std::vector()))>::type> + auto to_vector(Functor&& f = {}) -> std::vector()))>::type> { auto range = static_cast(this); - std::vector()))>::type> res; + std::vector()))>::type> res; for (const auto& e : *range) res.push_back(f(e)); return res; @@ -198,10 +198,10 @@ struct SmartRangeT * the set will contain the handles. */ template - auto to_set(Functor&& f = {}) -> std::set()))>::type> + auto to_set(Functor&& f = {}) -> std::set()))>::type> { auto range = static_cast(this); - std::set()))>::type> res; + std::set()))>::type> res; for (const auto& e : *range) res.insert(f(e)); return res; @@ -232,7 +232,7 @@ struct SmartRangeT * @param f Functor that is applied to all elements before computing minimum. */ template - auto min(Functor&& f) -> typename std::remove_reference()))>::type + auto min(Functor&& f) -> typename std::decay()))>::type { using std::min; @@ -241,7 +241,7 @@ struct SmartRangeT auto end = range->end(); assert(it != end); - typename std::remove_reference()))>::type res = f(*it); + typename std::decay()))>::type res = f(*it); ++it; for (; it != end; ++it) @@ -257,7 +257,7 @@ struct SmartRangeT * @param f Functor that is applied to all elements before computing maximum. */ template - auto max(Functor&& f) -> typename std::remove_reference()))>::type + auto max(Functor&& f) -> typename std::decay()))>::type { using std::max; @@ -266,7 +266,7 @@ struct SmartRangeT auto end = range->end(); assert(it != end); - typename std::remove_reference()))>::type res = f(*it); + typename std::decay()))>::type res = f(*it); ++it; for (; it != end; ++it) @@ -283,8 +283,8 @@ struct SmartRangeT * @param f Functor that is applied to all elements before computing maximum. */ template - auto minmax(Functor&& f) -> std::pair()))>::type, - typename std::remove_reference()))>::type> + auto minmax(Functor&& f) -> std::pair()))>::type, + typename std::decay()))>::type> { return std::make_pair(this->min(f), this->max(f)); }