Boost logo

Boost :

Subject: Re: [boost] [result_of] Allow result_of to work with C++11 lambdas
From: Mathias Gaunard (mathias.gaunard_at_[hidden])
Date: 2013-04-10 18:24:04


On 10/04/13 19:43, Nathan Crookston wrote:
> Hi Mathias,
>
> Mathias Gaunard wrote:
>
>> I personally have my own implementation of result_of which does this. My
>> implementation is also simpler, compiles faster, is optionally optimized
>> for compilers with variadic templates (also supports compilers with
>> decltype but no variadic templates), has preprocessing support, and has the
>> added benefit that result_of<Sig>::type is only defined if Sig is callable.
>>
>
> Sounds pretty slick. Is this in NT2, or just in some other code you have?

Yes. I've found that boost::result_of is often a performance bottleneck.
Unfortunately the code in Boost is not as simple as it could be; it
instantiates way too many templates, I suppose for legacy purposes.
My version could probably still be improved too.

> Just so it's clear to others on the list, boost::result_of (at least in
> trunk) also has result_of<Sig>::type that is only defined when Sig is
> callable. I believe Eric Niebler added that a while back.

Doesn't work with latest trunk.
The code below doesn't compile.

/home/mgaunard/dev/boost/trunk/boost/utility/result_of.hpp:173:8: error:
no class template named ‘result’ in ‘struct foo’

It does work, however, if instructed to use decltype. My version applies
SFINAE in C++03 and without SFINAE for expressions too.

#include <boost/utility/result_of.hpp>
#include <iostream>

struct foo {};

template<class T>
typename boost::result_of<T(int)>::type bar(T const& t);
void bar(...)
{
   std::cout << "not callable" << std::endl;
}

int main()
{
   bar(foo());
}


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk