I use the Boost.Parameter library for providing named parameters to a constructor.
BOOST_PARAMETER_NAME(windowFunction)
namespace detail
{
struct ClassAImpl
{
template <class ArgumentPack>
ClassAImpl(ArgumentPack const& args)
: mWindowFun(args[_windowFunction])
, [...]
{
}
boost::function<bool(int, int)> mWindowFun;
[...]
};
}
struct ClassA : detail::ClassAImpl
{
BOOST_PARAMETER_CONSTRUCTOR(
ClassA, (detail::ClassAImpl), tag
, (optional (windowFunction,*)
[...]))
};
Usually windowFunction
will be copied by the boost::function
object, however I want to also be able to pass by reference with boost::ref
.
However when I pass a function object with boost::ref
the reference_wrapper<T>
is removed and the ArgumentPack contains a reference to the T
value.
Question: Is there a way to prevent the removal of the reference_wrapper<T>
wrapper?
Example:
SomeFunctionObject s;
ClassA a(windowFunction = boost::ref(s));
will have SomeFunctionObject& s
passed to mWindowFun
in the constructor of ClassAImpl
instead of const reference_wrapper<SomeFunctionObject>&
. Thus, s
will be copied by boost::function
which is undesirable.
This seems currently not possible as Boost Parameter is explicitly unwrapping
reference_wrapper
s.This is necessary for allowing to pass positional arguments by reference.