Следуя Expressions as Fusion Sequences раздел Руководства пользователя Proto, я получаю до точки, где я итерация над уплощенным выражением прото: _1 + 2 + 3 + 4
:Отображения Expression уплощенной Phoenix с помощью Повысьте Fusion
#include <iostream>
#include <boost/phoenix.hpp>
namespace proto = boost::proto;
namespace fusion = boost::fusion;
namespace phoenix = boost::phoenix;
struct display
{
template<typename T>
void operator()(T const &t) const
{
std::cout << t << std::endl;
}
};
boost::proto::terminal<int>::type const _1 = {1};
int main(int argc, char *argv[])
{
fusion::for_each(
fusion::transform(
proto::flatten(_1 + 2 + 3 + 4)
, proto::functional::value()
)
, display()
);
return 0;
}
_1
заполнителя определяются как показанный выше, используя proto::terminal
. Я также хотел бы использовать Boost Phoenix; Однако, если я вместо того, чтобы использовать версию _1
, определенную в boost::phoenix::arg_names
в вызове fusion::for_each
, я получаю сообщение об ошибке : не могу связывать «зОго :: ostream {аки станда :: basic_ostream}» Lvalue к «станд :: basic_ostream & &». Могу ли я использовать заполнитель Phoenix, как это, с преобразованием Fusion?
Спасибо, что также работает для меня (GCC 4.7.2). – user2023370
Вы случайно знаете, почему я получаю сообщение об ошибке с 'proto :: display_expr (fusion :: at_c <0> (proto :: flatten (_1 + 2 + 3 + 4)));'? – user2023370
@ user2023370 'fusion :: at_c' требует [' Random Random Sequence'] (http://www.boost.org/libs/fusion/doc/html/fusion/sequence/concepts/random_access_sequence.html) и результат 'proto :: flatten' - это просто' 'Forward Sequence' '(http://www.boost.org/libs/fusion/doc/html/fusion/sequence/concepts/forward_sequence.html). Вы можете использовать 'proto :: display_expr (fusion :: at_c <0> (fusion :: as_vector (proto :: flatten (_1 + 2 + 3 + 4))));'. – 2013-03-05 14:55:25