当我以某种方式徘徊于他的just::thread库的他的Anthony Williams website的示例时,我正在阅读有关barber shop example的博客文章。

在其中,他具有一系列不继承任何内容的结构:

struct start_haircut {};
struct no_room {};
struct shop_closed {};

然后,他具有 receive 函数,可将.match()模板链接到:
jss::actor::receive()
    .match<start_haircut>(
        [&](start_haircut){
            //...
        })
    .match<no_room>(
        [&](no_room){
            //...
        })
    .match<shop_closed>(
        [&](shop_closed)
        {
            //...
        });

接收函数返回一个unspecified_message_receiver对象,该对象指定类型(shop_closed等)和lambda处理程序。
receivematch函数有什么内容? receivematch函数如何相互作用?

这是一个有趣的模式,可以在其所使用的线程模型之外具有应用程序。我对它在传感器之间通过tcp进行通信很感兴趣,在该传感器中连续传输小消息包和少量数据。

最佳答案

看起来(毫不奇怪)像Erlang。

您链接并引用的文档中对此进行了非常清楚的描述。



所以jss::actor::receive()unspecified_message_receiver



所以

.match<start_haircut>(
    [&](start_haircut){
        //...
    })

在先前返回的接收器中注册lambda以处理start_haircut类型的消息。
由于每个match返回一个消息接收者,因此您可以链接它们以注册更多处理程序。

我不确定还可以说些什么来澄清,但是更实际的用法可能是使用某些类型的类型,这些类型会携带某种有效负载,例如
struct start_haircut { enum { Long, Short, Shaved } style; };

jss::actor::receive()
    .match<start_haircut>(
        [&](start_haircut cut){
            switch (cut.style)
            {
                case start_haircut::Long:
                // ...
            }
        })
    .match<no_room>(
        [&](no_room){
            //...
        })
    .match<shop_closed>(
        [&](shop_closed)
        {
            //...
        });

(如果您看一下Erlang教程,例如"Learn you some Erlang for great good!",则这种界面可能更有意义)。

10-08 02:45