[Development] Proposal: Deprecating platforms in Qt 5.6 that don't support lambda

Matthew Woehlke mw_triad at users.sourceforge.net
Fri Feb 20 21:37:07 CET 2015


On 2015-02-20 14:42, Thiago Macieira wrote:
> On Friday 20 February 2015 12:53:24 Matthew Woehlke wrote:
>>   for (auto const i : qtEnumerate(map))
>>
>> Maybe it would be nice for Qt to provide one or both of these?
> 
> Sounds easy enough. Want to give it a try?

I'm happy to give you my headers; not sure when/if I'd have time to
clean them up as actual patches against Qt, however. For enumerate,
though, I technically need the customer's permission to share it.

> Note that this should also work for foreach:
> 
> 	foreach (const auto i, qtEnumerate(map))
> 
> Something like:
> 
> template <typename Map>
> struct QEnumerateMap : private Map
> {
> 	struct const_iterator {
> 		typename Map::iterator i;
> 		iterator(typename Map::iterator i) : i(i) {}
> 
> 		// need to return by value
> 		std::pair<typename Map::key_type, typename Map::value_type>
> 		value() const
> 		{ return std::make_pair(i.key(), i.value()); }
> 	};
> 
> 	const_iterator begin() const
> 	{ return iterator(Map::begin()); }
> 	const_iterator end() const
> 	{ return iterator(Map::end()); }
> };

No, that doesn't seem right at all (unless you were going for a
non-broken cref?).

The way I did it is I construct a minimal class that has a reference to
the map (though, as discussed, this might need to be a copy), containing
a private iterator type, and begin()/end() methods. The private iterator
type is constructed from the container iterator, and needs to implement
its own operator++, operator== and operator*. The last one is key; it
returns the underlying iterator, rather than value() of the same.

Index range works on basically the same idea, only the 'underlying
iterator' is a number, you construct it from a number, and begin()
returns an iterator(0) while end returns an iterator(m_end). The
iterator needs the same operators, with the obvious implementations.

This all works with range-based for. Not sure about foreach...

One thing I notice you *did* get right is separating the utility class
from the function to create it; you do need to do this for template
deduction.

-- 
Matthew




More information about the Development mailing list