Как использовать 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_wrappers.

Это необходимо для разрешения передачи позиционных аргументов по ссылке.

Другие вопросы по тегам