Отображение сплющенного выражения Феникса с помощью Boost Fusion

После Выражения как последовательности слияния В разделе Руководства пользователя Proto я дохожу до того, что перебираю плоское выражение Proto: _1 + 2 + 3 + 4:

#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, Я также хотел бы использовать
Повысить Феникс; однако, если я вместо этого использую версию _1 определяется в boost::phoenix::arg_names в призыве к fusion::for_eachЯ получаю ошибка: невозможно привязать значение ‘std :: ostream {aka std :: basic_ostream} к значению ‘std :: basic_ostream&&». Могу ли я использовать подобные заполнители Phoenix с преобразованием Fusion?

1

Решение

Нет ostream-вставки для 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()
);
}
3

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

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

По вопросам рекламы [email protected]