Boost的反射库PFR


目录

  • 目录
  • 简介
  • 使用方法
  • 限制
  • 总结

简介

Boost.PFR是一个Boost 1.75版本出的C++14的基础反射库,其使用非常简单,非常便捷,但是适用性也比较差,有很多的地方无法使用,适合比较简单的结构体。

使用方法

  1. 获取字段
struct simple {
  char a;
  float f;
};

sample var{};
boost::pfr::get<1>(var) = 1.2;

std::cout << var.f << std::endl; // 1.2
  1. 比较
assert(
  boost::pfr::eq(simple{'1', 2}, simple{'1', 2});
)
  1. 遍历
struct test {
  int f1;
  long f2;
};

test var{100, 200};

boost::pfr::for_each_field(var, [](auto& field) {
  field += 1;
})

  1. 输出
struct test {
  int f1;
  long f2;
};

test var{100, 200};
std::cout << boost::pfr::io(var) << std::endl;
  1. 为结构体添加简单的操作符
struct test {
  int f1;
  long f2;
}

BOOST_PFR_FUNCTIONS_FOR(test)

这个宏会为test结构体自动添加比较运算符和输入输出运输符。

  1. 获取结构体属性的数量
struct test {
  int a, b, c, d, e;
};

std::cout << boost::pfr::tuple_size::value << std::endl; //  输出5
  1. 将结构体解包

class MyData {
public:
  int a = 1;
  int b = 2;
};

int sa, sb;
MyData da;
std::tie(sa, sb) = boost::pfr::structure_to_tuple(MyData());
std::tie(sa, sb) = boost::pfr::structure_tie(da);

两个类似,但是也有一些不同。structure_to_tuple是复制,structure_tie是引用。

限制

需要满足SimpleAggregate要求。

  1. Aggregate Type: 没有用户定义的构造函数、没有private或者protecetd的非静态成员变量,没有基础类,没有虚拟函数;
  2. 没有const字段,没有引用或者C语言的数组。

总结

这个库的作用感觉非常的弱,只能用于比较特定的结构体。依据提供的方法,最好的运用途径就是替代tuple了。