Re: deducing the return type of a function call...
* James:
"Frank Neuhaus" <fneuhaus@uni-koblenz.de> wrote in message
news:hemspm$3hv$1@cache.uni-koblenz.de...
Hey,
"James" <no@spam.invalid> schrieb im Newsbeitrag
news:hemrjd$jbm$1@aioe.org...
I am struggling to find a way to get around having to explicitly pass
a return type for the following callback scheme I am playing around
with. Here is some sample code:
Maybe this can help you?
http://www.boost.org/doc/libs/1_35_0/libs/type_traits/doc/html/boost_typetraits/reference/function_traits.html
How in the heck does it determine all of those traits? Anyway, I don't
think it would work for me unless I could do something like:
int foo()
{
return 0;
}
void blah()
{
typedef function_traits<foo>::result_type return_type;
}
and have return_type be an int.
AFAICT, that's just not going to work here.
What am I missing?
Difficult to say since you haven't made your design requirements very clear.
But in general you can't portably deduce function result types in C++98 without
"registering" all relevant types first (you can however do that in C++0x).
Anyway, perhaps this helps:
<code>
#include <stdio.h>
template< typename Result >
class AbstractInvokable
{
public:
virtual Result operator()() const = 0;
};
template< typename Result, typename Arg >
class Invokable
: public AbstractInvokable< Result >
{
private:
Arg myArg;
Result (*myF)( Arg );
public:
Invokable( Result f( Arg ), Arg a )
: myArg( a )
, myF( f )
{}
virtual Result operator()() const
{
return myF( myArg );
}
};
template< typename Result, typename Arg >
Invokable< Result, Arg > bind( Result f( Arg ), Arg a )
{
return Invokable< Result, Arg >( f, a );
}
int foo( int x ) { return printf( "f(%d)\n", x ); }
void blah( char const* s ) { printf( "blah(\"%s\")\n", s ); }
int main()
{
AbstractInvokable<int> const& f = bind( foo, 42 );
AbstractInvokable<void> const& b = bind( blah, "whoopie doo!" );
f();
b();
}
</code>
Cheers & hth.,
- Alf