From d419a9a4376de7b2ae1dec7df09f8d034cc2d039 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 3 Apr 2019 14:18:19 -0700 Subject: [PATCH] [iter] Use different SFINAE scheme to make MSVC happy From Orvid King: TLDR; MSVC has some issues using sizeof(declval()) for SFINAE of templated types, so I just used SFINAE in a different context where MSVC doesn't have the issue. --- src/hb-iter.hh | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/hb-iter.hh b/src/hb-iter.hh index f23904c..afb0382 100644 --- a/src/hb-iter.hh +++ b/src/hb-iter.hh @@ -202,15 +202,18 @@ struct hb_iter_with_fallback_t : /* hb_is_iterable() */ -template -struct _hb_is_iterable -{ enum { value = false }; }; -template -struct _hb_is_iterable > -{ enum { value = true }; }; - -template -struct hb_is_iterable { enum { value = _hb_is_iterable::value }; }; +template +struct hb_is_iterable +{ + private: + template + static auto test (int) -> decltype (hb_declval (U).iter (), hb_true_t ()); + template + static hb_false_t test (...); + + public: + enum { value = hb_is_same (decltype (test (0)), hb_true_t) }; +}; #define hb_is_iterable(Iterable) hb_is_iterable::value /* TODO Add hb_is_iterable_of(). -- 2.7.4