std::tuple like methods for user defined types without any macro or boilerplate code
Switch branches/tags
Clone or download
Pull request Compare This branch is 1 commit ahead, 69 commits behind apolukhin:develop.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
doc Final MSVC fixes, including detection idiom rewrite and simplificatio… Oct 16, 2017
example Fix issue in test Sep 17, 2017
include/boost fix warnings generated by extra ; Mar 23, 2018
misc GCC related fixes and simplifications Oct 20, 2017
test Made tests more strict and updated MSVC bersion in readme Oct 20, 2017
.travis.yml Set sudo to true to make sanitizers comfortable Feb 20, 2018
README.md

README.md

Precise and Flat Reflection (ex Magic Get, ex PODs Flat Reflection)

This C++14 library is meant for accessing structure elements by index and providing 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
Master: Build Status Build status Coverage Status

Motivating Example #0

// requires: C++14
#include <iostream>
#include <string>
#include "boost/pfr/precise.hpp"

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

int main() {
    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!
}

Outputs:

Edgar Allan Poe was born in 1809

Motivating Example #1

// requires: C++14
#include <iostream>
#include "boost/pfr/precise.hpp"

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

int main() {
    using namespace boost::pfr::ops; // out-of-the-box ostream operator for all PODs!

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

Outputs:

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

Motivating Example #2

// requires: C++14
#include <iostream>
#include "boost/pfr/precise.hpp"

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

int main() {
    using namespace boost::pfr::ops; // out-of-the-box ostream operators for aggregate initializables!

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

Outputs:

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

Requirements and Limitations

General:

  • C++14 compatible compiler (GCC-5.0+, Clang, Visual Studio 2017 with /std:c++latest or /std:c++17, ...)
  • Static variables are ignored
  • T must be constexpr aggregate initializable and must not contain references nor bitfields

License

Distributed under the Boost Software License, Version 1.0.