diff --git a/src/blackmisc/predicates.h b/src/blackmisc/predicates.h index d97f73fd7..8f5ae60d0 100644 --- a/src/blackmisc/predicates.h +++ b/src/blackmisc/predicates.h @@ -32,7 +32,7 @@ namespace BlackMisc return [vs...](const auto &object) { bool equal = true; - tupleForEachPair(std::make_tuple(vs...), [ & ](auto member, const auto &value) { equal = equal && (object.*member)() == value; }); + tupleForEachPair(std::make_tuple(vs...), [ & ](auto member, const auto &value) { equal = equal && std::invoke(member, object) == value; }); return equal; }; } @@ -47,36 +47,36 @@ namespace BlackMisc { return [vs...](const auto &a, const auto &b) { - return std::forward_as_tuple((a.*vs)()...) < std::forward_as_tuple((b.*vs)()...); + return std::forward_as_tuple(std::invoke(vs, a)...) < std::forward_as_tuple(std::invoke(vs, b)...); }; } /*! * Returns a function object that returns the value returned by one of it's argument member functions. */ - template - auto MemberTransform(R(T::*memberFunc)() const) + template + auto MemberTransform(T memberFunc) { - return [memberFunc](const T &object) { return (object.*memberFunc)(); }; + return [memberFunc](const auto &object) { return std::invoke(memberFunc, object); }; } /*! * Returns a predicate that returns true if the isValid() method of the value returned from one of its member functions returns true. */ - template - auto MemberValid(R(T::*memberFunc)() const) + template + auto MemberValid(T memberFunc) { - return [memberFunc](const T &object) { return (object.*memberFunc)().isValid(); }; + return [memberFunc](const auto &object) { return std::invoke(memberFunc, object).isValid(); }; } /*! * Returns a predicate that returns true if the value returned by its argument's member function can be found in a captured container. * \warning The container is captured by reference, so be careful that it remains valid for the lifetime of the predicate. */ - template - auto MemberIsAnyOf(R(T::*memberFunc)() const, const C &container) + template + auto MemberIsAnyOf(T memberFunc, const C &container) { - return [memberFunc, &container](const T &object) { return container.contains((object.*memberFunc)()); }; + return [memberFunc, &container](const auto &object) { return container.contains(std::invoke(memberFunc, object)); }; } /*! @@ -96,7 +96,7 @@ namespace BlackMisc { return [vs...](const auto &a, const auto &b) { - return (((a.*vs)() == (b.*vs)()) && ...); + return ((std::invoke(vs, a) == std::invoke(vs, b)) && ...); }; } diff --git a/src/blackmisc/sequence.h b/src/blackmisc/sequence.h index 72de87b9b..f449098d0 100644 --- a/src/blackmisc/sequence.h +++ b/src/blackmisc/sequence.h @@ -515,9 +515,9 @@ namespace BlackMisc //! Split up the sequence into subsequences of elements having the same value for the given key. template - auto separateBy(Key k) const -> QMap().*k), CSequence> + auto separateBy(Key k) const -> QMap())), CSequence> { - return separateBy([k](const T &v) { return v.*k; }); + return separateBy([k](const T &v) { return std::invoke(k, v); }); } //! \private Calls detach on the internal QVector.