2015-02-09 62 views
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'; 
} 

回答

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

+0

當然它中。非常感謝,如此簡單的解決方案。 – nostep 2015-02-09 15:56:22