Re: [Boost-users] variadic template function using fusion vector

We want to hide from user the creation of the vector. The user just need to call the execute function like that execute(FOB,bar1,bar2,...,barn). Where the FOB is any function object followed by the original data. Regards Noman Javed

2010/1/13 noman javed
We want to hide from user the creation of the vector. The user just need to call the execute function like that execute(FOB,bar1,bar2,...,barn). Where the FOB is any function object followed by the original data.
You can do that, but execute must be a function object instead of function.
#include

Roman Perepelitsa wrote:
2010/1/13 noman javed
mailto:noman_bwp@yahoo.com> You can do that, but execute must be a function object instead of function.
#include
struct execute_impl {
template <class Seq> struct result { typedef void type; };
Yeah, used to be that way. And works (by "coincidence" :-). Fusion has been changed at some point to use the boost::result_of protocol for result type computation. Thus, to really get to the argument vector you'll have to write: template< typename Signature > struct result; template< class Self, class ArgSeq > struct result< Self(ArgSeq&) > // <- NOTE: deducing // [... defines type memember 'type'] Anyway, in this very case the result type does not depend on the arguments and so it's sufficient to just write: typedef void result_type;
template <class Seq> void operator()(Seq const & s) const { // s contains all arguments passed to execute. } };
boost::fusion::unfused
execute; int main() { const char* s = "hello"; int n = 42; execute(s, n); }
Here "execute" suffers from perfect forwarding problem, which you can solve by using perfect forwarding adaptor. There is one in p-stade http://p-stade.sourceforge.net/egg/doc/html/egg/function_adaptors.html#egg.f... and also I remember seeing one being proposed for boost, but I can't find it.
Once Fusion's Functional adapters used to attack the Forwarding Problem themselves. Today, there's Boost.Functional.Forward (and .Factory in case u want to e.g. fusion::invoke constructors). Regards, Tobias
participants (3)
-
noman javed
-
Roman Perepelitsa
-
Tobias Schwinger