Jon Stewart on 22 Aug 2003 23:21:03 -0000


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [ALACPP] boost::bind and global functions?


> Here's more code:
> 
> typedef void (*ProcessRowFunc)(FetchRow);
> 
>     bool MyQueryResultWrapper::nextRow(ProcessRowFunc func)
>     {
> 	// blah blah, get aFetchRow from Oracle...
> 	func(aFetchRow);
>     }
> 
> // read file info from oracle. This is inside  an instance method on a Take o
> bject
> MyQueryResultWrapper wrap(aCursorLikeThingie);
> while(wrap.nextRow(boost::bind(&Take::addFile, this, _1)));
> 
> void Take::addFile(FetchRow row)
> {
> 	// process the row and add it to myself.
> }
> 
> Does this reveal the madness of my ways? I'm afraid I can't post much more of
>  our Super Secret Important Code in unobfuscated form...


Yes, indeed it does. The return value of boost::bind is a boost::function, 
NOT a simple function pointer. While the returned boost::function will 
mimic ProcessRowFunc, in terms of calling syntax, they are very different 
types (for one thing, sizeof(ProcessRowFunc) != sizeof(boost::function< 
void, FetchRow >)).

Rather than worrying about what type ProcessRowFunc is, try this:

template<class _FnT>
bool MyQueryResultWrapper::nextRow(_FnT func)
{
  // blah blah
  func(aFetchRow);

  return true;
}

It'll work with a function pointer and with the properly parameterized 
boost::function.



Jon
-- 
Jon Stewart                                 Advanced Los Angeles C++
stew1@xxxxxxxxxxx                           http://www.alacpp.org
_______________________________________________
alacpp mailing list
alacpp@xxxxxxxxxxx
http://lists.ellipsis.cx/mailman/listinfo/alacpp