1 // PR c++/46105 2 3 template< typename T > 4 struct empty { // support class is like stripped-down enable_if 5 typedef void type; 6 }; 7 8 template< class T, typename v = void > // v is always void! 9 struct element { 10 typedef typename T::value_type type; 11 }; 12 13 template< class T > // T in deduced context, T::element_type is SFINAE: 14 struct element< T, typename empty< typename T::element_type >::type > { 15 typedef typename T::element_type type; 16 }; 17 18 template< class T > 19 struct element< T const, typename empty< typename T::element_type >::type > { 20 typedef typename T::element_type const type; 21 }; 22 23 struct has_et { 24 typedef int element_type; 25 }; 26 27 element<has_et const>::type ip = 0; 28