повысить генерацию духовной кармы из набора структур с использованием функции-члена

Я пытаюсь использовать карму для создания списка строк, разделенных запятыми, из вектора структур, содержащих функцию-член, которая предоставляет строку.

Хотя я могу генерировать вывод одной строки, используя phoenix::bind, и я могу генерировать вывод csv из вектора строк, я изо всех сил пытаюсь совместить эти два подхода.

В следующем примере первое правило работает нормально, второе не скомпилируется (используя VS2013, boost 1.57), выдавая ошибку phoenix: «невозможно преобразовать из 'std::vector> *' в 'foo *'», так что ясно семантическое действие, которое будет работать для одного экземпляра структуры, в этом случае неверно. Является ли единственным ответом использование адаптера Fusion?

#include <iostream>
#include <vector>
#include <string>
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix.hpp>

namespace karma = boost::spirit::karma;
namespace phx = boost::phoenix;

struct foo 
{
  std::string f() const { return "bar"; }
};

int main()
{
  std::string output;
  typedef std::back_insert_iterator< std::string > iterator;
  iterator it(output);

  // this works:
  std::vector<std::string> svec = { "foo", "bar", "baz" };
  karma::rule< iterator, std::vector<std::string>() > svec_rule = karma::string % ',';
  karma::generate(it, svec_rule, svec);
  std::cerr << output << '\n';

  // but this won't compile
  std::vector<foo> vfoo(3);
  karma::rule< iterator, std::vector<foo>&() > vfoo_rule = karma::string[karma::_1 = phx::bind(&foo::f, karma::_val)] % ',';
  karma::generate(it, vfoo_rule, vfoo);
  std::cerr << output << '\n';
}

person nostep    schedule 09.02.2015    source источник


Ответы (1)


_val представляет vector<foo> в этом правиле. Вы не можете назвать foo::f вектором.

Вместо этого создайте правило для foo (или используйте attr_cast<>):

karma::rule<iterator, foo()> foo_rule = karma::string [ karma::_1 = phx::bind(&foo::f, karma::_val) ];
karma::generate(it, foo_rule % ',', vfoo);

std::cerr << output << '\n';

Отпечатки bar,bar,bar

person sehe    schedule 09.02.2015
comment
Конечно, это так. Большое спасибо, такое простое решение. - person nostep; 09.02.2015