C++函数斜杠运算符lambda表达式

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令牌和框架.


Nic*_*ith 7

它不是标准的C++语法,而是特定于框架的.用下划线(前缀的元素_hello,_message等等)用于与运行,并创建在编译之前必要的定义的符号定义发生器.

关于它的更多信息,请参见本页末尾:http://siliconframework.org/docs/symbols.html.Qt用它的moc工具做类似的事情.

  • 但是`GET/_hello = [](){return D(_message ="Hello world."); 在C++中,它本身是可行的 (7认同)
  • 这个语法有什么*不标准*? (4认同)