boost/libs/pfr
2021-10-05 21:37:46 +02:00
..
doc [DEV] add v1.76.0 2021-10-05 21:37:46 +02:00
example [DEV] add v1.76.0 2021-10-05 21:37:46 +02:00
meta [DEV] add v1.76.0 2021-10-05 21:37:46 +02:00
misc [DEV] add v1.76.0 2021-10-05 21:37:46 +02:00
test [DEV] add v1.76.0 2021-10-05 21:37:46 +02:00
index.html [DEV] add v1.76.0 2021-10-05 21:37:46 +02:00
LICENSE_1_0.txt [DEV] add v1.76.0 2021-10-05 21:37:46 +02:00
README.md [DEV] add v1.76.0 2021-10-05 21:37:46 +02:00

Boost.PFR

This is a C++14 library for very basic reflection that gives you access to structure elements by index and provides other std::tuple like methods for user defined types without any macro or boilerplate code.

Latest documentation

Test results

Branches Build Tests coverage More info
Develop: Build Status Build status Coverage Status details...
Master: Build Status Build status Coverage Status details...

Motivating Example #0

#include <iostream>
#include <fstream>
#include <string>

#include "boost/pfr.hpp"

struct some_person {
  std::string name;
  unsigned birth_year;
};

int main(int argc, const char* argv[]) {
  some_person val{"Edgar Allan Poe", 1809};

  std::cout << boost::pfr::get<0>(val)                // No macro!
      << " was born in " << boost::pfr::get<1>(val);  // Works with any aggregate initializables!

  if (argc > 1) {
    std::ofstream ofs(argv[1]);
    ofs << boost::pfr::io(val);                       // File now contains: {"Edgar Allan Poe", 1809}
  }
}

Outputs:

Edgar Allan Poe was born in 1809

Motivating Example #1

#include <iostream>
#include "boost/pfr/precise.hpp"

struct my_struct { // no ostream operator defined!
    int i;
    char c;
    double d;
};

int main() {
    my_struct s{100, 'H', 3.141593};
    std::cout << "my_struct has " << boost::pfr::tuple_size<my_struct>::value
        << " fields: " << boost::pfr::io(s) << "\n";
}

Outputs:

my_struct has 3 fields: {100, H, 3.14159}

Motivating Example #2

#include <iostream>
#include "boost/pfr/precise.hpp"

struct my_struct { // no ostream operator defined!
    std::string s;
    int i;
};

int main() {
    my_struct s{{"Das ist fantastisch!"}, 100};
    std::cout << "my_struct has " << boost::pfr::tuple_size<my_struct>::value
        << " fields: " << boost::pfr::io(s) << "\n";
}

Outputs:

my_struct has 2 fields: {"Das ist fantastisch!", 100}

Requirements and Limitations

See docs.

License

Distributed under the Boost Software License, Version 1.0.