mas*_*mas 10 c++ lambda c++11 c++14
事实上我不知道如何非常精确.
今天,我浏览了以下页面:
http://siliconframework.org/docs/hello_world.html
我发现了以下语法:
GET / _hello = [] () { return D(_message = "Hello world."); }
Run Code Online (Sandbox Code Playgroud)
我发现"GET"可以是lambda表达式的函数,但是我无法弄清楚"/"和"_hello"在这里是什么意思,以及它们如何连接到有意义的东西.
那么,"_message ="是什么?
顺便说一句,我的主要C++知识是在C++ 11之前.
我用Google搜索了一下.
有人可以解释一下吗?
Yak*_*ont 11
这个库使用所谓的嵌入式域特定语言,它以一种允许看似不同的语言只是C++程序的另一部分的方式来扭曲C++和预处理器语法.
总之,魔术.
第一点神奇之处在于:
iod_define_symbol(hello)
Run Code Online (Sandbox Code Playgroud)
这是一个生成_hello类型标识符的宏_hello_t.
它还创建了一个_hello_t继承自CRTP帮助程序的类型iod::symbol<_hello_t>.
_hello_t覆盖各种运算符(包括operator=和operator/),它们不会执行您通常期望的C++对象的行为.
GET / _hello = [] () { return D(_message = "Hello world."); }
Run Code Online (Sandbox Code Playgroud)
所以这个电话
operator=(
operator/( GET, _hello ),
/* lambda_goes_here */
);
Run Code Online (Sandbox Code Playgroud)
同样在lambda中:
D(_message = "Hello world.");
Run Code Online (Sandbox Code Playgroud)
是
D( operator=(_message, "Hello world.") );
Run Code Online (Sandbox Code Playgroud)
operator/并且operator=可以做几乎任何事情.
在这种D情况下,=不进行任何分配 - 相反,它构建一个基本上表示"被调用的字段"message"被赋值的结构" "Hello world.".
_message知道它被调用"message"是因为它是由一个宏生成的iod_define_symbol(message),它们接受了字符串message并将其与类型一起存储_message_t,并创建了_message该类型实例的变量.
D 获取大量此类键/值对并将它们捆绑在一起.
lambda返回此包.
因此[] () { return D(_message = "Hello world."); },lambda返回一组键值对附件,以奇怪的方式编写.
然后,我们调用operator=与GET/_hello在左侧.
GET是另一个operator/重载的全局对象.我没跟踪过它.假设它是类型iod::get_t(我组成了这个名字:再次,我没有查找它是什么类型,它并不重要)
然后iod::get_t::operator/(iod::symbol<T> const&)重载以生成另一个帮助器类型.此类型获取T的名称(在本例中"hello"),并等待由lambda分配.
分配时,它不会按预期执行.相反,它会关闭并在"hello"该lambda 之间建立一个关联并调用该lambda,其中lambda将返回一组生成的键值对D.
然后,我们将一个或多个此类关联传递给http_api,这些关联收集这些捆绑包并构建运行带有这些查询和那些响应的Web服务器所需的数据,可能包括标记"我将成为http服务器".
sl::mhd_json_serve 然后获取该数据和端口号,并实际运行Web服务器.
所有这些都是一堆抽象层,使一些反射更容易.生成的结构都具有C++标识符和类似的字符串.类似的字符串在其中公开,并且当生成json序列化(或反序列化)代码时,这些字符串用于读取/写入json值.
仅存在宏以使得编写样板更容易.
可能有助于进一步阅读的技术包括"表达模板","反射","CRTP",嵌入式"领域特定语言",如果您想了解这里发生了什么.
上面的一些包含次要的"谎言告诉孩子们" - 特别是,操作符语法不像我暗示的那样工作.(a/b不等同于operator/(a,b),第二个不会调用成员操作符/.理解它们只是函数是我想要的,而不是语法是相同的.)
@mattheiuG(该框架的作者)在本文后面的评论中分享了这些幻灯片,进一步解释D了_message令牌和框架.
它不是标准的C++语法,而是特定于框架的.用下划线(前缀的元素_hello,_message等等)用于与运行,并创建在编译之前必要的定义的符号定义发生器.
关于它的更多信息,请参见本页末尾:http://siliconframework.org/docs/symbols.html.Qt用它的moc工具做类似的事情.
| 归档时间: |
|
| 查看次数: |
552 次 |
| 最近记录: |