The type is messy :(
What do you think of writing type like that :
```
namespace {

  template<typename Iterable>
  using IterableValue = std::remove_reference<Iterable>::type::iterator::value_type;

  template<typename Iterable, int which>
  using IterableUnpack = typename std::tuple_element<which, IterableValue<Iterable>::type;

  template<typename Iterable>
  using DictKeyFromIterable =  IterableUnpack<Iterable, 0>;

  template<typename Iterable>
  using DictValueFromIterable =  IterableUnpack<Iterable, 1>;

  template<typename Iterable>
  using DictFromIterable = types::dict<DictKeyFromIterable<Iterable>,
                                       DictValueFromIterable<Iterable>>;


}



template<class Iterable>
DictFromIterable<Iterable> dict( Iterable&& iterable) {
  DictFromIterable<Iterable> out=types::empty_dict();
  for(auto const & i : iterable)
    out[std::get<0>(i)] = std::get<1>(i);
  return out;
}
```