Qt5.x 中 QMap 无法直接在 Range-based for loop 中使用结构化绑定获取 key 和 value ,故添加 RangeWrapper 以支持这种写法
定义RangeWarpper
template<class Map>
struct RangeWrapper {
using MapIterator = typename Map::iterator;
using Key = typename Map::key_type;
using T = typename Map::mapped_type;
Map ↦
RangeWrapper(Map & map_) : map(map_) {}
struct iterator {
MapIterator mapIterator;
iterator(const MapIterator &mapIterator_): mapIterator(mapIterator_) {}
std::pair<Key,T> operator*() {
return {mapIterator.key(), mapIterator.value()};
}
iterator & operator++() {
++mapIterator;
return *this;
}
bool operator!=(const iterator & other) {
return this->mapIterator != other.mapIterator;
}
};
iterator begin() {
return map.begin();
}
iterator end() {
return map.end();
}
};
// Function to be able to use automatic template type deduction
template<class Map>
RangeWrapper<Map> toRange(Map & map)
{
return RangeWrapper<Map>(map);
}
实际使用
// Usage code
QMap<QString, QString> extensions;
for(auto [key, value] : toRange(extensions)) {
qDebug()<< key << value;
}