Я пытался позвонить 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
Предполагая, что ошибка указывает где-то глубоко внутри 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
не имеет этой проблемы
Других решений пока нет …