当我以某种方式徘徊于他的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处理程序。receive
和match
函数有什么内容? receive
和match
函数如何相互作用?这是一个有趣的模式,可以在其所使用的线程模型之外具有应用程序。我对它在传感器之间通过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!",则这种界面可能更有意义)。