Невозможно вызвать ленивую лямбда-функцию с параметрами через boost :: phoenix :: function

Я пытался позвонить boost::phoenix::function на основе лямбда-функции с параметрами и не удалось. Если я называю это без параметров таким образом:

const auto closure = [](){
cout<< "test" << endl;
};

typedef decltype(closure) ClosureType;
const boost::phoenix::function<ClosureType> lazyFunc (std::move(closure));
lazyFunc()();

все хорошо компилируется. Но когда я объявляю хотя бы один параметр лямбды:

const auto  closure = [](int& param)  { cout<<"Test" << param << endl; };

typedef decltype(closure) ClosureType;
const boost::phoenix::function<ClosureType> lazyFunc (std::move(closure));
lazyFunc(arg1)(a);

компиляция не удалась с огромным следом стека глубоко внутри повышение :: result_of

2

Решение

Предполагая, что ошибка указывает где-то глубоко внутри Boost.ResultOf (как видно из это демо), это может быть связано с тем, что тип закрытия лямбда-выражения не реализует протокол ResultOf.

Несколько простой обходной путь к этому — определить BOOST_RESULT_OF_USE_DECLTYPE, что делает boost::result_of обойти свой собственный протокол ResultOf, используя вместо этого decltype вычислить возвращаемые типы. Это не включено по умолчанию, потому что не многие компиляторы (на момент выпуска Boost 1.51) достаточно совместимы для работы этой функции; планируется, что этот символ будет определен автоматически (Boost.Config) для тех компиляторов, которые могут работать с ним для 1,52.

Вот демонстрация того, как выглядит Boost.Phoenix с decltypeПриведено boost::result_of, Я должен был изменить int& в int const& так как i по-видимому, пересылается как const int, Это кажется фундаментальным ограничением boost::phoenix::function, с помощью boost::phoenix::val не имеет этой проблемы

2

Другие решения

Других решений пока нет …