[iter] Handhold hb_is_iterator() type deduction
authorBehdad Esfahbod <behdad@behdad.org>
Mon, 7 Jan 2019 22:24:23 +0000 (17:24 -0500)
committerBehdad Esfahbod <behdad@behdad.org>
Mon, 21 Jan 2019 01:12:12 +0000 (20:12 -0500)
by partial-instantiating on Iter.

src/hb-iter.hh

index 7b975e6..5c02a27 100644 (file)
@@ -161,15 +161,19 @@ struct hb_is_iterable { enum { value = _hb_is_iterable<T, hb_true_t>::value }; }
 
 /* hb_is_iterator() / hb_is_sorted_iterator() */
 
-template<typename Iter = void, typename Item = void> char _hb_is_iterator (...) { return 0; };
-template<typename Iter, typename Item> int _hb_is_iterator (hb_iter_t<Iter, Item> *) { return 0; };
-template<typename Iter, typename Item> int _hb_is_iterator (hb_iter_t<Iter, const Item> *) { return 0; };
-template<typename Iter, typename Item> int _hb_is_iterator (hb_iter_t<Iter, Item&> *) { return 0; };
-template<typename Iter, typename Item> int _hb_is_iterator (hb_iter_t<Iter, const Item&> *) { return 0; };
-static_assert (sizeof (char) != sizeof (int), "");
+template <typename Iter>
+struct _hb_is_iterator
+{
+  char operator () (...) { return 0; };
+  template<typename Item> int operator () (hb_iter_t<Iter, Item> *) { return 0; };
+  template<typename Item> int operator () (hb_iter_t<Iter, const Item> *) { return 0; };
+  template<typename Item> int operator () (hb_iter_t<Iter, Item&> *) { return 0; };
+  template<typename Item> int operator () (hb_iter_t<Iter, const Item&> *) { return 0; };
+  static_assert (sizeof (char) != sizeof (int), "");
+};
 template<typename Iter, typename Item>
 struct hb_is_iterator { enum {
-  value = sizeof (int) == sizeof (_hb_is_iterator (hb_declval<Iter*> ())) }; };
+  value = sizeof (int) == sizeof (hb_declval<_hb_is_iterator<Iter>> () (hb_declval<Iter*> ())) }; };
 #define hb_is_iterator(Iter, Item) hb_is_iterator<Iter, Item>::value
 
 #define hb_is_sorted_iterator(Iter, Item) \