std::tuple like methods for user defined types without any macro or boilerplate code
std::tuple like methods for user defined types without any macro or boilerplate code
This C++14 library provides basic reflection capabilities, allowing access to structure elements by index, retrieval of aggregate field names, and std::tuple-like methods for user-defined types — all without macros or boilerplate code.
Boost.PFR is a part of the Boost C++ Libraries. However, Boost.PFR is a header only library that does not depend on Boost. You can just copy the content of the "include" folder from the github into your project, and the library will work fine.
For a version of the library without boost:: namespace see PFR.
Latest developer documentation
#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 macros!
<< " was born in " << boost::pfr::get<1>(val); // Works with any aggregate type!
if (argc > 1) {
std::ofstream ofs(argv[1]);
ofs << boost::pfr::io(val); // File now contains: {"Edgar Allan Poe", 1809}
}
}
Output:
Edgar Allan Poe was born in 1809
#include <iostream>
#include "boost/pfr.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}
#include <iostream>
#include "boost/pfr.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}
…
Outputs:
(34 Chip Douglas 2500)
Distributed under the Boost Software License, Version 1.0.
Accessing addresses to members
Is it possible to handle C arrays? Possible implementation linked
Can packed structures be supported?
add support for bit-fields
PFR doesn't work with `std::vector<std::unique_ptr<T>>` field in C++20
tuple_size does not work on clang
Add support for enums
Compile failed with field typed `std::optional<Eigen::Matrix3d>`
PFR does not work with non-copyable aggregates on MSVC 17.10