Question

#include <type_traits>
using namespace std;

struct asd{
    void f();
};

int f();

typedef typename result_of<decltype(f)>::type result_free;
typedef typename result_of<decltype(&asd::f)>::type result_mem;

both the typedefs give an error

In file included from ../main.cpp:1:0:
/usr/include/c++/4.6/type_traits: In instantiation of ‘std::_Result_of_impl<false, false, int>’:
/usr/include/c++/4.6/type_traits:1215:12:   instantiated from ‘std::result_of<int()>’
../main.cpp:10:41:   instantiated from here
/usr/include/c++/4.6/type_traits:1192:9: error: ‘std::declval [with _Tp = int, typename std::add_rvalue_reference<_Tp>::type = int&&]()’ cannot be used as a function
../main.cpp:10:43: error: invalid combination of multiple type-specifiers
../main.cpp:10:59: error: invalid type in declaration before ‘;’ token
../main.cpp:11:49: error: ‘type’ in ‘struct std::result_of<void (asd::*)()>’ does not name a type
../main.cpp:11:64: error: invalid type in declaration before ‘;’ token
Was it helpful?

Solution

result_of is result_of<Fn(ArgTypes...)>, not just result_of<Fn>;

Try

typedef typename result_of<decltype(&f)()>::type result_free;
typedef typename result_of<decltype(&asd::f)(asd)>::type result_mem;

(works with gcc 4.6.2)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top