3
我想從包含提供字符串的成員函數的結構向量中使用karma生成逗號分隔的字符串列表。使用成員函數從結構集合中提升精神業力
雖然我可以使用phoenix :: bind生成單個字符串輸出,並且我可以從一個字符串矢量生成一個csv輸出,但我正在努力結合這兩種方法。
在下面的例子中,第一個規則工作正常,第二個不會編譯(使用VS2013,boost 1.57),給出一個phoenix錯誤:「不能從'std :: vector> *'轉換爲'foo *' 「,很明顯,在這種情況下,對結構的單個實例起作用的語義行爲是不正確的。是使用融合適配器的唯一答案嗎?
#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';
}
當然它中。非常感謝,如此簡單的解決方案。 – nostep 2015-02-09 15:56:22