在boost spirit中将分隔符传递给子规则

在boost spirit中将分隔符传递给子规则,boost,boost-spirit,boost-spirit-karma,Boost,Boost Spirit,Boost Spirit Karma,这是我在这里提到的问题的继续 我想将该规则包装到另一个规则中,并在这样做时,将column指令传递给子规则,但我无法找出正确的方法 下面是代码 #include <boost/spirit/include/karma.hpp> #include <boost/fusion/include/struct.hpp> #include <boost/fusion/include/nview.hpp> ///////////////////////////////

这是我在这里提到的问题的继续

我想将该规则包装到另一个规则中,并在这样做时,将column指令传递给子规则,但我无法找出正确的方法

下面是代码

#include <boost/spirit/include/karma.hpp>
#include <boost/fusion/include/struct.hpp>
#include <boost/fusion/include/nview.hpp>

///////////////////////////////////////////////////////////////////////////////
namespace client
{


struct BoxData
{
    int num;
    std::string datatype;
    std::string dataname;
    std::string inputicon;
};

struct Box
{
    std::vector<BoxData> box_data;
};

typedef std::back_insert_iterator<std::string> iterator_type;
}

BOOST_FUSION_ADAPT_STRUCT(
        client::BoxData,
//      (int, num)
        (std::string, datatype)
        (std::string, dataname)
        (std::string, inputicon)
)

BOOST_FUSION_ADAPT_STRUCT(
        client::Box,
        (std::vector<client::BoxData>, box_data)
)


///////////////////////////////////////////////////////////////////////////////
int main()
{
    // some employees
    std::vector<client::BoxData> const employees{
            {25, "int",    "sra_command", "fa fa-wrench"},
            {26, "float",  "swt_command", "fa fa-wrench"},
            {27, "double", "msc_command", "fa fa-mobile"},
            {28, "int",    "sra_command", "fa fa-wrench"},
            {29, "float",  "swt_command", "fa fa-wrench"},
            {30, "double", "msc_command", "fa fa-mobile"},
            {31, "int",    "sra_command", "fa fa-wrench"},
            {32, "float",  "swt_command", "fa fa-wrench"},
            {33, "double", "msc_command", "fa fa-mobile"},
    };

    client::Box box;
    ///TODO prevent copying of the vector
    box.box_data = employees;

    // now print them all
    std::string generated;
    {
        using namespace boost::spirit::karma;

        using Sink = client::iterator_type;
        using BoxDataAttr = client::BoxData;
        using BoxAttr = client::Box;

        rule<Sink, BoxDataAttr(),space_type> small_box = "<B>" << string << "<1>" << string << "<2>" << string << "<3>";

        rule<Sink , BoxAttr()> big_box = "<Start>" << *small_box << "<End>" ;

        generate(Sink(generated),[big_box],box);
    }

    std::cout << generated << std::endl;
}
分隔符,以便将列分隔符应用于
小方框规则

因此,预期输出变为

<Start><B>int<1>sra_command<2>fa fa-wrench<3><B>float<1>swt_command<2>fa fa-wrench<3>delimiter
<B>double<1>msc_command<2>fa fa-mobile<3><B>int<1>sra_command<2>fa fa-wrench<3>delimiter
<B>float<1>swt_command<2>fa fa-wrench<3><B>double<1>msc_command<2>fa fa-mobile<3>delimiter
<B>int<1>sra_command<2>fa fa-wrench<3><B>float<1>swt_command<2>fa fa-wrench<3>delimiter
<B>double<1>msc_command<2>fa fa-mobile<3>delimiter<End>
  • 从IDL文件生成HTML元素。每个结构都包装在一个框中,其中包含它们内部的各个元素,并在较小的框中包含它们的图标/可选部分。第n个分隔符用于生成引导网格,以便在屏幕上放置这些框

  • 使用websocket实现完成HTML页面,该实现在接收到包含DOM元素名称-值对的JSON数据时自动更新DOM元素。同样,对于每个输入,都会实现一个send命令,将其封装在JSON中并发送到web服务器

  • 自动生成Web服务器的代码,这样剩下的唯一代码就是从外部源接收/传输数据,并生成与JSON的所有转换


  • 下面的用例促使我寻找解析器/生成器解决方案。

    我不太确定您的问题的原因,但在我看来,昨天的解决方案仍然有效:

        rule<Sink, BoxDataAttr()> small_box = "<B>" << string << "<1>" << string << "<2>" << string << "<3>";
    
        rule<Sink, BoxAttr()> big_box = "<Start>" << columns(4, "delimiter\n") [small_box % eol] << "<End>" ;
    
        generate(Sink(generated), big_box, employees);
    
    更一般地说,移动语义可以用于:

    box.box_data = std::move(employees);
    

    为手头的问题添加了一些背景信息关于添加的背景,我要说的是,直接在Fusion的基础上实现一个数量级将更容易。它可以为您提供它的“反射”部分,您可以使用它来驱动常规的泛型编程。关于数据结构驱动的生成,也可以从中获得灵感。关于模板扩展样式生成(HTML),还可以看看库,比如最后,看看protobuf+grpc之类的库,以获得关于(JSON)rpc调用和从服务定义生成的服务的启示。我知道你参加了这个练习,但是好的练习是从计划和查看现有知识开始的:)谢谢你的反馈。我一定会调查的。我曾计划在RCP类和服务中使用apache thrift,但这看起来更好。在实际工作之前,我必须更好地规划我的项目:)
    struct Data1
    {
    int command_one output "fa fa-wrench";
    float commmand_two output "fa fa-sensor";
    }
    
    struct Data2
    {
    bool a input switch;
    int b input progress_bar {0,100} ;
    }
    
        rule<Sink, BoxDataAttr()> small_box = "<B>" << string << "<1>" << string << "<2>" << string << "<3>";
    
        rule<Sink, BoxAttr()> big_box = "<Start>" << columns(4, "delimiter\n") [small_box % eol] << "<End>" ;
    
        generate(Sink(generated), big_box, employees);
    
    client::Box const employees { {
            {25, "int",    "sra_command", "fa fa-wrench"},
            {26, "float",  "swt_command", "fa fa-wrench"},
            {27, "double", "msc_command", "fa fa-mobile"},
            {28, "int",    "sra_command", "fa fa-wrench"},
            {29, "float",  "swt_command", "fa fa-wrench"},
            {30, "double", "msc_command", "fa fa-mobile"},
            {31, "int",    "sra_command", "fa fa-wrench"},
            {32, "float",  "swt_command", "fa fa-wrench"},
            {33, "double", "msc_command", "fa fa-mobile"},
    } };
    
    box.box_data = std::move(employees);