on Mon Sep 08 2008, e r
hello,
i have something like this:
*hpp :
namespace tag{ template<typename Id> struct sequence{ static ::boost::parameter::keyword< a_<Id> >& a; static ::boost::parameter::keyword< b_<Id> >& b;
static ::boost::parameter::keyword< arg_method_<Id> >& arg_method; }; }
namespace sequence_arg{ struct method{}; struct a:public method{}; struct b:public method{}; }
class sequence{ public: template
sequence(const Id& id,const ArgPack&args){ fill_elements(id,args,args[tag::sequence<Id>::arg_method]); } private: template
void fill_elements( const Id& id, const ArgPack& args, sequence_arg::a method ); template void fill_elements( const Id& id, const ArgPack& args, sequence_arg::b method ); }; *.cpp :
sequence seq( id(), ( tag::sequence::a = a_value, tag::sequence::arg_method = sequence_arg::a() ) );
So far so good except there is redundancy of information about which method to use, so I'm looking for a way to be able to call say
sequence seq( id(), ( tag::sequence::a = a_value ) )
Any suggestion?
Use the macros -- they automatically generate the SFINAE you need so that the right overload will be chosen -- and add type requirements. See http://www.boost.org/doc/libs/1_36_0/libs/parameter/doc/html/index.html#sign... and http://www.boost.org/doc/libs/1_36_0/libs/parameter/doc/html/index.html#addi.... BOOST_PARAMETER_FUNCTION( (void), fill_elements, (tag), (required (id,*) (method, a)) (optional ... )) { ... } BOOST_PARAMETER_FUNCTION( (void), fill_elements, (tag), (required (id,*) (method, b)) (optional ... )) { ... } HTH, -- Dave Abrahams BoostPro Computing http://www.boostpro.com