c++ - Using meta programming to select member variables -
i trying create game save system using boost serialization, , want create easy way clients select member variables serialization.
basically want user input this:
class apple : public actor { public: int a; bool istasty; float unimportantdata; set_saved_members(a, istasty); };
and expanded like
class apple : public actor { public: // ... template<typename archive> void serialize(archive& arch, const unsigned int version) { arch & boost_serialization_nvp(a); arch & boost_serialization_nvp(istasty); }
of course, fine if requires few more macros this.
i'm fine template meta programming (preferably) or preprocessor meta programming.
c++11 fine, too.
thanks help!
previously had boost-focused answer wasn't able test. here's more comprehensible using combination of template meta-programming , macros:
#include <iostream> // build base template save implementation template <typename... arg_types> struct save_impl; // create doserialize function recursively serialize objects. template <typename archive, typename first_type, typename... other_types> struct save_impl<archive, first_type, other_types...> { static void doserialize(archive& arch, first_type & arg1, other_types&... others) { // instead of printing in next line, do: arch & boost_serialization_nvp(a); std::cout << arch << arg1 << std::endl; save_impl<archive, other_types...>::doserialize(arch, others...); } }; // base case end recursive call of struct-based doserialize template <typename archive> struct save_impl<archive> { static void doserialize(archive& arch) { ; } }; // create doserialize function call struct-based implementation. template <typename archive, typename... arg_types> void doserialize(archive & arch, arg_types&... args) { save_impl<archive, arg_types...>::doserialize(arch, args...); } // create desired macro add serialize function class. #define set_saved_members(...) \ template<typename archive> \ void serialize(archive& arch) { \ doserialize(arch, __va_args__); \ }
currently have printing test (but indicate above line need change). here test using apple example:
class apple { public: int a; bool istasty; float unimportantdata; set_saved_members(a, istasty); }; int main() { apple = {7, false, 2.34}; a.istasty=true; a.serialize("archive: "); }
note i'm sending in string instead of archive object -- works fine fact it's using print.
Comments
Post a Comment