CAF(C++ actor framework)(序列化之类,无需序列化,直接传)(二)

昨天讲了Struct,还是不够满意,毕竟C++里面类用的比较多嘛,那就先上个类,这段代码是我稍微改编了一下的结果。

#include <utility>
#include <iostream>
#include <vector>
#include "caf/all.hpp"

using std::cout;
using std::endl;
using std::make_pair;
using std::vector;
using namespace caf;
class foo {

private:
  int a_;
  vector<int> b_;
public:

  foo(int a0 = 0, vector<int> b0 = vector<int>(0)) : a_(a0), b_(b0) { }

  foo(const foo&) = default;

  foo& operator=(const foo&) = default;

  int a() const { return a_; }

  void set_a(int val) { a_ = val; }

  vector<int> b() const { return (vector<int>)b_; }

  void set_b(const vector<int> val){ b_ = val; }
};

bool operator==(const foo& lhs, const foo& rhs) {
  return  lhs.a() == rhs.a()
       && lhs.b() == rhs.b();
}

void testee(event_based_actor* self) {
  self->become (
    [=](const foo& val) {
      aout(self)<< val.a()<<endl;
      auto b = val.b();
      for (auto it = b.begin(); it != b.end(); ++it)
      {
        aout(self)<<*(it)<<endl;
      }
      self->quit();
    }
  );
}

int main(int, char**) {

   //###################First method####################
   announce<foo>("foo", make_pair(&foo::a, &foo::set_a),
                make_pair(&foo::b, &foo::set_b));

  //####################Second method####################
  //a member function pointer to get an attribute of foo
  using foo_getter = int (foo::*)() const;
  using foo_getter1 = vector<int> (foo::*)() const;
  // a member function pointer to set an attribute of foo
  using foo_setter = void (foo::*)(int);
  using foo_setter1 = void (foo::*)(const vector<int>);

  foo_getter g1 = &foo::a;
  foo_setter s1 = &foo::set_a;
  // same is true for b
  foo_getter1 g2 = &foo::b;
  foo_setter1 s2 = &foo::set_b;
  announce<foo>("foo", make_pair(g1, s1), make_pair(g2, s2));

  //####################Third method######################
  // alternative syntax that uses casts instead of variables
  // (returns false since foo is already announced)
  announce<foo>("foo",
               make_pair(static_cast<foo_getter>(&foo::a),
                        static_cast<foo_setter>(&foo::set_a)),
               make_pair(static_cast<foo_getter1>(&foo::b),
                         static_cast<foo_setter1>(&foo::set_b)));

  {
    scoped_actor self;
    auto t = spawn(testee);
    self->send(t, foo{1,{2,3}});
  }
  await_all_actors_done();
  shutdown();
  return 0;
}

贴上结果

CAF 告诉我们,你想在消息中传送一个类,你只要告诉它你所有成员的getter 和setter函数,然后呢它提供了三种方式,(一般就选第一种 没有任何区别的 =  = )。

稍微再深入一些的是类里面再套类对象,其实也是很方便知识多了一个嵌套。可以看github上announce4.cpp

https://github.com/actor-framework/actor-framework/blob/master/examples/type_system/announce_4.cpp

最后还有一篇想讲一下自己对announce5的代码理解和改编吧。

求粉丝,呵呵呵~

时间: 2024-08-09 22:03:11

CAF(C++ actor framework)(序列化之类,无需序列化,直接传)(二)的相关文章

可序列化和自定义序列化

序列化技术的主要两个目的是:持久化存储.按值封送. .NET Framework支持三种序列化器:Binary.XML.SOAP.他们各有优缺点,分别列如下 1. Binary序列化是完全保真的,因为除非特殊声明为NonSerialized,那么所有成员(包括私有的和公有的)都会被序列化.该序列化器的结果体积比较小,是二进制格式存储的.所以不便于平台复用. 2. XML序列化只序列化公有成员.它的结果是标准的XML文档,有利于跨平台. 3. SOAP序列化其实可以说是XML序列化的一种,但它的结

C#中的二进制序列化和Json序列化

序列化就是把一个对象变成流的形式,方便传输和还原.小弟不才,总结下对二进制序列化和Json序列化的使用: 1.首先,二进制序列化(BinaryFormatter)要求要序列化的类必须是可序列化的(即在类定义的前面加Serializable关键字),而且它的父类类型也必须是可序列化的,经过查看发现,Dotnet中很多类型和结构都有这个标记:而Json序列化不用写标记: 2.如果类中某些属性不希望被二进制序列化,加NonSerialized关键字即可,而要二进制序列化的属性的类型必须是可序列化的数据

[疯狂Java]I/O:I/O流的最高境界——对象流(序列化:手动序列化、自动序列化、引用序列化、版本)

1. 什么是对象流:序列化/反序列化的概念 1) 对象流是和字节流/字符流同处于一个概念体系的: a. 这么说字节流是流动的字节序列,字符流是流动的字符序列,那么对象流就是流动的对象序列咯? b. 概念上确实可以这样理解,对象流就是专门用来传输Java对象的: c. 但是字节和字符都是非常直观的二进制码(字节本身就是,而字符是一种二进制编码),二进制码的流动是符合计算机的概念模型的,可是对象是一个抽象的东西,对象怎么能像二进制码那样流动呢? d. 其实很好理解,对象流只不过是Java的API而已

java编解码技术,json序列化与二进制序列化

1.何为json序列化与二进制序列化 通常我们在程序中采用的以json为传输,将json转为对象的就是json序列化了.而二进制序列化通常是我们将数据转换为二进制进行传输,然后在进行各类转换操作 2.适用场景 小编觉得当数据采用json传输的时候,适用与web与控制层的转换,前端js对json的支持较好,而程序内部系统与系统之间采用二进制序列化编码形式进行编码进行数据传输,这样可提高数据传输效率 3.优缺点 json序列化有点就是通俗易懂,常用,易于与前端交互,缺点就是没有二进制序列化后的数据传

Atitit php序列化&#160;php的serialize序列化和json序列化

Atitit php序列化 php的serialize序列化和json序列化 PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的Using Serialized PHP withYahoo! Web Services 一文中给出所有的字母标示及其含义:a - arrayb - booleand - doublei - integero - common objectr - references - stringC - custom objectO - classN - nu

[LeetCode] Serialize and Deserialize BST 二叉搜索树的序列化和去序列化

Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another comput

IOSerialize,xml和json,soap序列化器,二进制序列化器,XML序列化器,文件 检查、新增、复制、移动、删除

1 文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/读取配置文件3 三种序列化器4 xml和json1.文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/读取配置文件 using System.IO; /// <summary> /// 配置绝对路径 /// </summary> private static string LogPath = ConfigurationManager.AppSettings["LogPath&

[LeetCode] Serialize and Deserialize Binary Tree 二叉树的序列化和去序列化

Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another comput

C#大学课程(第五版)课后习题17.4序列化和去序列化

/*17.4 (序列化和去序列化)修改前面的程序,使其能利用可以被序列化和去序列化的类对象*/using System;[ Serializable ]class ClassGrade{ public string Last { get; set; } public string First { get; set; } public string Id { get; set; } public string Class { get; set; } public string Grade { ge

DRF框架之Serializer序列化器的序列化操作

在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer. 今天,我们就先来学习一下Serializer序列化器. 使用Serializer序列化器的开发步骤: 1. 定义Serializer序列化器 首先,我们要在子应用中,创建见一个serializers.py文件,用来编写Serializer序列化器代码. from rest_framework import serializers # 定义序列化器 class BookInfoSerializer