[Development] C++11 decltype magic with a container?

Olivier Goffart olivier at woboq.com
Thu May 23 17:58:49 CEST 2013


On Thursday 23 May 2013 17:36:14 Olivier Goffart wrote:
> On Thursday 23 May 2013 17:24:35 Stephen Kelly wrote:
> > On Thursday, May 23, 2013 07:56:16 Thiago Macieira wrote:
> > > On quinta-feira, 23 de maio de 2013 16.12.27, Stephen Kelly wrote:
> > > > I was not referring to the patch in gerrit. I was referring to the
> > > > code
> > > > I
> > > > pasted. It contains a struct called 'A', and I made a note and a
> > > > comment
> > > > about  enable_if.
> > > 
> > > Oh! Somehow I missed that!
> > 
> > Yes, I guessed that, which is why I asked you to re-read it several times
> > 
> > :).
> > :
> > > Yes, you need to add those enable_ifs. Or concepts :-)
> > 
> > I guess you also missed where I wrote "I also tried an enable_if, but that
> > doesn't solve the problem either."
> > 
> > So, I was looking for other ideas, but I don't think there is any workable
> > solution. Maybe looking for mapped_type, key_type and value_type on the
> > T::value_type (recursively) might work, but it would be so ugly and only
> > really partially working that I don't think I'll even try.
> > 
> > Thanks,
> 
> First, the operator== should be outside of the class. (or as a friend
> function)
> 
> It probably would becomes something like

I sent to fast the previous mail.
There was a part too much in it. It should have been:

>    friend auto operator==(const T &c1, const T&c2) -> decltype(c1.t == c2.t)
       {...}

however that does not do SFINAE since the T is a parametter of the class, and 
not the function. 
You could do:

friend template <typename X> auto operator==(const Container<X> &c1                                                                                  
                                             const Container<X> &c2)
          -> decltype(c1.t == c2.t)    {...}

-- 
Olivier 

Woboq - Qt services and support - http://woboq.com - http://code.woboq.org




More information about the Development mailing list