Loosen the requirements on the container passed to QtConcurrent::map*
Using std::begin() and std::end() forces the user to have const begin() and end() member functions being defined for the passed container. This is because std::declval<T>() returns rvalue which forces the compiler to select std::{begin, end}()(const Container &c) overloads and an test for a presence of const {begin, end}() methods. Change-Id: I9d96d9f73891ece53224f1741a1334500f7b35ad Reviewed-by: Andrei Golubev <andrei.golubev@qt.io> Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
parent
1918c689d7
commit
d5c53554e5
@ -51,8 +51,8 @@ namespace QtPrivate {
|
||||
template <class T, typename = void>
|
||||
struct IsIterable : std::false_type {};
|
||||
template <class T>
|
||||
struct IsIterable<T, std::void_t<decltype(std::begin(std::declval<T>())),
|
||||
decltype(std::end(std::declval<T>()))>>
|
||||
struct IsIterable<T, std::void_t<decltype(std::declval<T>().begin()),
|
||||
decltype(std::declval<T>().end())>>
|
||||
: std::true_type
|
||||
{ };
|
||||
|
||||
|
@ -77,7 +77,7 @@ struct Argument
|
||||
template <class Sequence>
|
||||
struct Argument<Sequence, typename std::enable_if<IsIterableValue<Sequence>>::type>
|
||||
{
|
||||
using Type = std::decay_t<decltype(*std::begin(std::declval<Sequence>()))>;
|
||||
using Type = std::decay_t<decltype(*std::declval<Sequence>().begin())>;
|
||||
};
|
||||
|
||||
template <class Iterator>
|
||||
|
@ -159,8 +159,6 @@ public:
|
||||
const_iterator cend() const { return data.cend(); }
|
||||
iterator begin() { return data.begin(); }
|
||||
iterator end() { return data.end(); }
|
||||
const_iterator begin() const { return data.cbegin(); }
|
||||
const_iterator end() const { return data.cend(); }
|
||||
bool operator==(const MoveOnlyVector &other) const { return data == other.data; }
|
||||
|
||||
private:
|
||||
|
Loading…
x
Reference in New Issue
Block a user