Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设计C++;用于标记和传输树的DSL 简言之 我试图为C库设计一个更好的C++接口,它通过一个通信信道(类似于ILoSvs. STDIO)发送树状表达式。我不确定是否有可能在C++中设计一个DSL来表示这些树,同时避免运行时开销,如果是的话,如何。 C库的简化说明_C++_Templates_Dsl_Api Design_Notation - Fatal编程技术网

设计C++;用于标记和传输树的DSL 简言之 我试图为C库设计一个更好的C++接口,它通过一个通信信道(类似于ILoSvs. STDIO)发送树状表达式。我不确定是否有可能在C++中设计一个DSL来表示这些树,同时避免运行时开销,如果是的话,如何。 C库的简化说明

设计C++;用于标记和传输树的DSL 简言之 我试图为C库设计一个更好的C++接口,它通过一个通信信道(类似于ILoSvs. STDIO)发送树状表达式。我不确定是否有可能在C++中设计一个DSL来表示这些树,同时避免运行时开销,如果是的话,如何。 C库的简化说明,c++,templates,dsl,api-design,notation,C++,Templates,Dsl,Api Design,Notation,有一个C库可以通过通信通道发送“表达式”。这里的“表达式”指的是一种树结构,可以用类似于函数调用的方式方便地表示 比如说, f(1, 2, g(3), "foo") 表示此树: 在这一点上,你们中的一些人可能会认识到,但我决定将其忽略,因为这与问题无关 我们将f作为头,将1、2、g(3)作为参数 要发送此表达式,我们将编写以下内容: putfead(“f”/*name*/,3/*参数计数*/); 整数(1); 整数(2); putHead(“g”/*name*/,1/*参数计数*/); 整数

有一个C库可以通过通信通道发送“表达式”。这里的“表达式”指的是一种树结构,可以用类似于函数调用的方式方便地表示

比如说,

f(1, 2, g(3), "foo")
表示此树:

在这一点上,你们中的一些人可能会认识到,但我决定将其忽略,因为这与问题无关

我们将
f
作为头,将
1
2
g(3)
作为参数

要发送此表达式,我们将编写以下内容:

putfead(“f”/*name*/,3/*参数计数*/);
整数(1);
整数(2);
putHead(“g”/*name*/,1/*参数计数*/);
整数(3);
putString(“foo”);
问题: <> P>是否可以设计一个更方便的C++ API,具有以下特点?
  • 编写起来更简洁(想想
    iostreams
    vs
    stdio
  • 不需要明确指定每个头的参数计数;相反,它使用一种方便的表示法(类似于上面的
    f(1,2,g(3))
    ),从中自动推断参数计数
  • 实现(2)无运行时开销(即在编译时推断参数计数)
  • 必须在后台使用上述C接口
  • 我可以使用类似流的接口(即,不需要显式指定每个参数的整数、字符串等类型)执行(1)。我可以用一种涉及额外运行时计算的方式来做(2)。但我不知道(2)/(3)是否可以结合C++的特性。最后,我希望在C++内部有一个方便的表达式。
    <>强>那么在C++中可以设计DSL,同时避免所有运行时开销吗?如果是,如何进行?我不一定要寻找一个完整的解决方案,代码作为答案,只是一些指针开始,或一个方法的总结,可能会工作。< /强> < /p> < p>我可以想出几种方法来表示树在C++中。其中一些(#1,#2)的实现需要构建一个中间结构,然后在最后调用C函数。其他节点(#5,#6)可以在运行时调用C函数,因为任何节点的子节点数在编译时都是已知的

    1) 使用流畅的界面和重载:

    Tree()
      .head("f")
        .put(1)
        .put(2)
        .head("g")
          .put(3)
          .end()
        .put("foo")
        .end();
    
    2) 或者,不调用end():


    3) 使用运算符“表达式模板”可能会有帮助:请添加注释,并给我一个机会来解决任何问题。这三个参数都只是将参数填充到一个元组中,但应该可以递归这些参数并进行适当的C API调用。@melak47非常感谢您的提示。我的工作忙得不可开交,所以我还不能给你足够的时间,但我想给你一个信号,我确实看过你的代码,我很感激。
    head("f")
      .put(1)
      .put(2)
      .put(head("g")
        .put(3))
      .put("foo");
    
    Tree("f")
      << 1
      << 2
      << (Tree("g") << 3)
      << "foo";
    
    Tree("f")
      (1)
      (2)
      (Tree("g")(3))
      ("foo")
    
    Tree { "f", {
      1,
      2,
      { "g", { 3 } }
      "foo",
    } }
    
    head("f").put(
      1,
      2,
      head("g").put(3)
      "foo");