auto p0 = spawn_typed( on_arg_match >> [](int a, int b) { return static_cast<double>(a) * b; }, on_arg_match >> [](double a, double b) { return make_cow_tuple(a * b, a / b); } );
As you can see, the argument to spawn_typed is a match expression rather than a function. This is because a typed actor is not allowed to change its behavior. The messaging interface is burnt into its type. In the example above, the type of p0 is typed_actor_ptr<replies_to<int, int>::with<double>,replies_to<double, double>::with<double, double>>. In this way, the compiler is now able to type-check your messages:
send(p0, 42); // <- compiler error send(p0, 42, 24); // <- ok sync_send(p0, 1, 2, 3).then ... // <- compiler error sync_send(p0, 1, 2).then( [](float) { ... } // <- compiler error: expected double ); sync_send(p0, 1, 2).then( [](double d) { ... } // <- ok );
Typed actors are not "feature complete" yet, i.e., typed actors cannot be published and it is not possible to use priorities when sending a message to a typed actor. However, this is just a matter of time. To learn more about typed actors, visit Section 15 of the 0.8 manual.
As if typed actors were not enough, version 0.8 includes yet another new kind of actors: brokers. A broker connects your actor system to any other network protocol. The new release includes an example featuring Google Protobuf: examples/remote_actors/protobuf_broker.cpp.
A small addition that is worth mentioning is the new exit reason exit_reason::user_shutdown. This reason can be used whenever you force actors to quit as part of application shutdown or for shutting down parts of your system that are no longer necessary.