2013-03-03 2 views
1

Следуя 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?

ответ

3

Нет встроенного встраивающего устройства для phoenix::arg_names::_1. Мы можем легко добавить один. Это компилируется для меня с clang ++ (trunk):

#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; 
    } 
}; 

namespace boost { namespace phoenix 
{ 
    template<int N> 
    std::ostream& operator<<(std::ostream& sout, argument<N> const& arg) 
    { 
    return sout << "_" << N; 
    } 
}} 

int main() 
{ 
    fusion::for_each(
    fusion::transform(
     proto::flatten(phoenix::arg_names::_1 + 2 + 3 + 4) 
    , proto::functional::value() 
    ) 
    , display() 
); 
} 
+0

Спасибо, что также работает для меня (GCC 4.7.2). – user2023370

+0

Вы случайно знаете, почему я получаю сообщение об ошибке с 'proto :: display_expr (fusion :: at_c <0> (proto :: flatten (_1 + 2 + 3 + 4)));'? – user2023370

+2

@ 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