On Fri, 18 Oct 2024 at 15:24, Patrick Palka <ppa...@redhat.com> wrote: > > On Fri, 18 Oct 2024, Jonathan Wakely wrote: > > > On 16/10/24 21:39 -0400, Patrick Palka wrote: > > > On Tue, 15 Oct 2024, Jonathan Wakely wrote: > > > > +#if __cplusplus < 201103L > > > > + > > > > + // True if we can unwrap _Iter to get a pointer by using > > > > std::__niter_base. > > > > + template<typename _Iter> > > > > + struct __unwrappable_niter > > > > + { > > > > + template<typename> struct __is_ptr { enum { __value = 0 }; }; > > > > + template<typename _Tp> struct __is_ptr<_Tp*> { enum { __value = 1 > > > > }; }; > > > > + > > > > + typedef __decltype(std::__niter_base(*(_Iter*)0)) _Base; > > > > + > > > > + enum { __value = __is_ptr<_Base>::__value }; > > > > + }; > > > > > > It might be slightly cheaper to define this without the nested class > > > template as: > > > > > > template<typename _Iter, typename _Base = > > > __decltype(std::__niter_base(*(_Iter*)0))> > > > struct __unwrappable_niter > > > { enum { __value = false }; }; > > > > > > template<typename _Iter, typename _Tp> > > > struct __unwrappable_niter<_Iter, _Tp*> > > > { enum { __value = true }; }; > > One minor nit, we might as well use 'value' since it's a reserved name > even in C++98?
Huh, I was under the impression it wasn't, but indeed we have binder1st::value and binder2nd::value! Why have we been using __value throughout cpp_type_traits.h then!?! I have indeed pushed it now, but could tweak that, as I'm still working in that file.