"Ian McCulloch"
Peter Dimov wrote:
Ian McCulloch wrote:
Yes, if you want to forward to a function but you don't know if it takes arguments by value or const reference.
It doesn't matter. When you forward, you pass to result_of the exact types of the arguments you are supplying in the function (object) call, with a reference when the argument is an lvalue.
int x; long y; int const z; int g(); int & h();
f(x, y); // result_of
f(1, x); // result_of f(z, 4); // result_of f( g(), h() ); // result_of What is 'f' and how it takes its arguments in the cases above does not affect how result_of is used.
But what happens if F doesn't have an operator() overload that takes F(int const&, int) but only has F(int, int) ? It seems you need to know this in advance. I tried detecting it with SFINAE but that doesn't work; I would have expected that if result
has no member type then result_of would simply be an empty struct, but instead the program is ill-formed. What I am trying to do is forward calls to an object with an overloaded operator() and nested struct result defined appropriately, but I don't know whether the operator() wants pass-by-value or pass-by-const-reference.
Are you sure you want result_of<> rather than typeof()? Would you consider typeof emulation library, that is in the review queue right now? Regards, Arkadiy