2013-11-20 2 views
2

Я очень новичок в Boost :: Phoenix, и я использую его для выполнения FP на C++. Я пошел по учебнику на своих официальных страницах. Тем не менее, мне интересно, почему примеры не показывают, как «Сохранить» переменные. Например, в примере значений сказано использовать функциональную переменнуюBoost Значение и значение функции феникса

std::cout << val(3)() << std::endl; 

он непосредственно распечатывает выполненный результат. Что делать, если я хочу сохранить переменную? как

type t = val(3); 

Что такое тип val(3)? То же самое происходит, когда я хочу объявить тип переменной функции, возвращаемой ленивой функцией. Каков его тип? Я не понимаю, почему весь учебник всегда выводит его немедленно. Я использую это неправильно?

Спасибо, Yi

ответ

3

Вы всегда можете (demangle) typeid(...phoneix expression...).name() (или создать ошибку компилятора), чтобы увидеть тип выражения. Вскоре вы поймете, что вы не имеете в виду (и непрактично) знать тип, который представляет выражение (в некоторых случаях это десятки строк).

Так, отвечая на ваш первый вопрос:

typeid(boost::phoenix::val(3.) = 
boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<double>, 0l> > 

Все внутри actor это деталь реализации, что вы не должны полагаться.

В C++ 11 вы можете использовать auto, но так как все, что вы хотите знать, является функцией аспект этого вы можете сделать почти достичь того же, сохраняя выражение как boost::function (теперь std::function). Например:

auto f1 = boost::phoenix::val(3.); 
std::function<double()> f2 = boost::phoenix::val(3.); 

Тогда

f1() 

дает 3.

f2() 

также дает 3.

Отвечая на второй вопрос, если вам нужно знать тип выражения, которое вы используете в неправильной мое мнение, потому что это деталь реализации (на самом деле она изменилась в другой версии Phoenix).