Как использовать boost :: ref с библиотекой Boost.Parameter при передаче аргументов? - PullRequest
1 голос
/ 10 ноября 2011

Я использую библиотеку 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 Ответ

1 голос
/ 24 ноября 2011

В настоящее время это кажется невозможным, поскольку параметр Boost явно разворачивается reference_wrapper s.

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

...