设计C++;用于标记和传输树的DSL 简言之 我试图为C库设计一个更好的C++接口,它通过一个通信信道(类似于ILoSvs. STDIO)发送树状表达式。我不确定是否有可能在C++中设计一个DSL来表示这些树,同时避免运行时开销,如果是的话,如何。 C库的简化说明
有一个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/*参数计数*/); 整数
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
vsstdio
)f(1,2,g(3))
),从中自动推断参数计数<>强>那么在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");