$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Johan Nilsson (r.johan.nilsson_at_[hidden])
Date: 2006-03-01 05:32:30
Hi,
I've just started playing around with Boost.Parameter. I'm in the progress
of wrapping a legacy C library and some of the structs used have plenty of
members, most of which have reasonable defaults. I thought that the
Parameter library would be a nice fit here, but ended up with a couple of
questions:
1. How can I define constructor for a class taking named parameters, without
using the double parentheses syntax? The following basic idea works, but is
ugly:
---
...
BOOST_PARAMETER_KEYWORD(tag, minVal)
BOOST_PARAMETER_KEYWORD(tag, maxVal)
struct Foo
{
template<typename ArgPack>
Foo(ArgPack& args)
{
m_minVal = args[minVal|0];
m_maxVal = args[maxVal|100];
}
...
};
void bar()
{
Foo foo(( minVal = 1, maxVal = 2)); // Note double parens
}
---
I've experimented some with defining a parameter::parameters specification
and use (the undocumented) BOOST_PARAMETER_MEMFUN, but that obviously
doesn't work (forwarding, return values and constructors don't mix). It
should be possible (I think) to define a BOOST_PARAMETER_CTOR macro that
generate the ctor overloads and forwards to a setter method instead of the
other way around.
I guess I could create a free or static member function that constructs an
object, but that would either force me to create heap-based objects, or
invoke potentially expensive copy ctors.
2. Is there a way of detecting whether an argument was passed using position
or name? Or, even better, is there a way of restricting the arguments to
only be passed by name using the parameters specification?
3. Not a question really, but having a default arity of 5 seems awfully low
to me. I hit that limit on first usage, and as the named parameters are
supposed to be used in the interface of my wrapping library, forcing users
to define BOOST_PARAMETER_MAX_ARITY "globally" feels a bit like asking for
someone coming up and asking me to decode some compile errors.
[I'm using the latest cvs head of boost, in combination with VC 8.0]
Regards,
Johan Nilsson