Как использовать boost::ref с библиотекой Boost.Parameter при передаче аргументов?
Я использую библиотеку 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
что нежелательно.
1 ответ
Это кажется в настоящее время невозможным, так как параметр Boost явно развернут reference_wrapper
s.
Это необходимо для разрешения передачи позиционных аргументов по ссылке.