|
Boost Users : |
From: jbd (evadream.mlist_at_[hidden])
Date: 2006-05-12 17:11:21
Hello,
> Peter Dimov wrote:
> It isn't clear why do you need to bind bar2 at all, instead of just
> using boost::function < void (int) > f3( &bar2 ) ;
To make a long story short, i'd like people
always use the same mecanism (syntax), not a boost::bind here and nothing
there.
Maybe I tried to simplify my problem too much. The small code i'm
"working" on is at the end of this message. I will try to say what i
really want to do with words.
The idea :
class FunctionInterface :
-> a pure virtual classe with an public void execute(const std::string&) =
0 member
class GeneralFunctor :
-> a class with a boost::shared_ptr<FunctionInterface> function_ member
which is called via the operator()(const std::string) const ;
The constructor take a pointer to a FunctionInterface.
template < typename Func >
class Functor : public FunctionInterface
-> keeps a boost::function<Func> as a member and implement the
execute function
template < typename FuncType >
GeneralFunctor MakeFunctor(FuncType func)
-> This is my helper function to build a GeneralFunctor from any
boost::function
Here is some example :
GeneralFunctor f1( MakeFunctor( boost::bind(&bar) ) ) ;
GeneralFunctor f2( MakeFunctor( boost::bind(&bar2,_1) ) ) ;
But i'd like to write for the convenience of the user and save some typing :
GeneralFunctor f2( MakeFunctor( boost::bind(&bar2) ) ) ;
But why do i need to use boost::bind here ? Why not directy a
boost::function like you suggest to me ? Something like
GeneralFunctor f3( MakeFunctor( boost::function<void (int)>(&bar2) ) ) ;
As i said, i don't want people (me ;)) asking themself what they
should do in this or this situation. That's why i introduce my helper
function, mybind, which i can use like that :
template <typename Ret, typename Arg1>
boost::function<Ret (Arg1)> mybind(Ret (*Func)(Arg1))
{
boost::function<Ret (Arg1)> f(Func) ;
return f ;
}
GeneralFunctor f4( MakeFunctor( mybind(bar2) ) ) ;
I really can always call MakeFunctor with a boost::function directly,
something like MakeFunctor( boost::function<void (int)>(&bar2) )
But my purpose is just to make my life easier by using a uniform way
letting boost::bind, or a plenty of overloaded mybind function, doing all
the work :D I'd like not to fill the boost::function template parameters
myself each time.
My message is certainly quite confuse, i'm sorry for that but it certainly
show that i don't know well the subject ... and the english language =)
Thank you anyway.
===========================
#include <iostream>
#include <string>
#include <stdexcept>
#include <boost/smart_ptr.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
class FunctionInterface
{
public:
typedef boost::shared_ptr<FunctionInterface> pointer ;
virtual ~FunctionInterface() {}
virtual std::string execute(const std::string& params="") const = 0 ;
} ;
template < typename Func >
class Functor : public FunctionInterface
{
private:
typedef Func func_type ;
func_type func_ ;
public:
Functor(Func f) : func_(f) {}
std::string execute(const std::string& params="") const
{
return "" ;
}
}
;
class GeneralFunctor
{
public:
GeneralFunctor(const FunctionInterface::pointer func) : function_(func) {}
std::string operator ()(const std::string& params = "") const
{
if ( !function_ ) throw "Error calling null function pointer" ;
return function_->execute(params) ;
}
private:
boost::shared_ptr<FunctionInterface> function_ ;
} ;
template < typename FuncType >
GeneralFunctor MakeFunctor(FuncType func)
{
FunctionInterface::pointer ptr(new Functor<FuncType>(func)) ;
return GeneralFunctor(ptr) ;
}
template <typename Ret, typename Arg1>
boost::function<Ret (Arg1)> mybind(Ret (*Func)(Arg1))
{
boost::function<Ret (Arg1)> f(Func) ;
return f ;
}
void bar()
{}
void bar2(int a)
{}
int main (int argc, char* argv[])
{
try
{
GeneralFunctor f1( MakeFunctor( boost::bind(&bar) ) ) ;
GeneralFunctor f2( MakeFunctor( boost::bind(&bar2,_1) ) ) ;
GeneralFunctor f3( MakeFunctor( boost::function<void (int)>(&bar2) ) ) ;
GeneralFunctor f4( MakeFunctor( mybind(bar2) ) ) ;
}
catch(std::exception& e)
{
std::cout << e.what() << '\n' ;
return -1 ;
}
catch(...)
{
std::cout << "Non standard exception\n" ;
return -1 ;
}
}
===========================
Le Fri, 12 May 2006 22:18:57 +0300, Peter Dimov a écrit :
> jbd wrote:
>
>> template <typename Ret, typename Arg1>
>> boost::function<Ret (Arg1)> mybind(Ret (*Func)(Arg1))
>> {
>> boost::function<Ret (Arg1)> f(Func) ;
>> return f ;
>> }
>
> [...]
>
>> // doesn't work :
>> // boost::function < void (int) > f2( boost::bind(&bar2) ) ;
>>
>> // this is ok
>> boost::function < void (int) > f3( mybind(&bar2) ) ;
>
> It isn't clear why do you need to bind bar2 at all, instead of just using
>
> boost::function < void (int) > f3( &bar2 ) ;
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net