aboutsummaryrefslogtreecommitdiff
path: root/ports/freeopcua/use_another_implementation_of_has_begin_end.patch
blob: 34fa77f7c9b3ced55c79064f422e42c289e0328c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
diff --git a/include/opc/ua/protocol/variant.h b/include/opc/ua/protocol/variant.h
index 9dc5b15..317cb17 100644
--- a/include/opc/ua/protocol/variant.h
+++ b/include/opc/ua/protocol/variant.h
@@ -76,22 +76,25 @@ public:
 template <typename T>
 struct has_begin_end
 {
-  template<typename C> static char (&f(typename std::enable_if <
-                                       std::is_same<decltype(static_cast<typename C::const_iterator(C::*)() const>(&C::begin)),
-                                       typename C::const_iterator(C::*)() const>::value, void >::type *))[1];
+  struct Dummy { typedef void const_iterator; };
+  typedef typename std::conditional<has_const_iterator<T>::value, T, Dummy>::type TType;
+  typedef typename TType::const_iterator iter;
 
-  template<typename C> static char (&f(...))[2];
+  struct Fallback { iter begin() const; iter end() const; };
+  struct Derived : TType, Fallback { };
 
-  template<typename C> static char (&g(typename std::enable_if <
-                                       std::is_same<decltype(static_cast<typename C::const_iterator(C::*)() const>(&C::end)),
-                                       typename C::const_iterator(C::*)() const>::value, void >::type *))[1];
+  template<typename C, C> struct ChT;
 
+  template<typename C> static char (&f(ChT<iter (Fallback::*)() const, &C::begin>*))[1];
+  template<typename C> static char (&f(...))[2];
+  template<typename C> static char (&g(ChT<iter (Fallback::*)() const, &C::end>*))[1];
   template<typename C> static char (&g(...))[2];
 
-  static bool const beg_value = sizeof(f<T>(0)) == 1;
-  static bool const end_value = sizeof(g<T>(0)) == 1;
+  static bool const beg_value = sizeof(f<Derived>(0)) == 2;
+  static bool const end_value = sizeof(g<Derived>(0)) == 2;
 };
 
+
 template<typename T>
 struct is_container_not_string : std::integral_constant < bool, has_const_iterator<T>::value && has_begin_end<T>::beg_value && has_begin_end<T>::end_value >
 { };