Я использую библиотеку Boost.Parameter для предоставления именованных параметров конструктору.
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,*)
[...]))
};
Обычно windowFunction
копируется объектом boost::function
, однако я также хочу иметь возможность передавать по ссылке с boost::ref
.
Однако, когда я передаю функциональный объект с boost::ref
, reference_wrapper<T>
удаляется, и ArgumentPack содержит ссылку на значение T
.
Вопрос: Есть ли способ предотвратить удаление оболочки reference_wrapper<T>
?
Пример:
SomeFunctionObject s;
ClassA a(windowFunction = boost::ref(s));
будет передано SomeFunctionObject& s
в mWindowFun
в конструкторе ClassAImpl
вместо const reference_wrapper<SomeFunctionObject>&
. Таким образом, s
будет скопировано boost::function
, что нежелательно.