#ifndef variadic_learn_h__
#define variadic_learn_h__
#include <iostream>
#include <string>
namespace xLearn{
namespace serialize
{
template<typename ty, class enable = void>
struct serialize_impl;
template<typename ty >
inline void print_val(ty& val)
{
typedef typename std::remove_cv<ty>::type rty;
serialize_impl<rty>::write(val);
}
}
void print_members()
{
return;
}
template<typename head, typename... args>
void print_members(head& h, args& ... args_)
{
std::cout << h << "\n";
if (sizeof...(args))
{
print_members(args_...);
}
}
#define ARGS_LEARN(TYPE,...) \
namespace serialize\
{\
template<>\
struct serialize_impl < TYPE , void >\
{\
struct serialize_helper : public TYPE\
{\
inline void write_() const\
{\
print_members(__VA_ARGS__);\
}\
};\
static inline void write( TYPE const& v)\
{\
reinterpret_cast<serialize_helper const &>(v).write_();\
}\
};\
}
}
#endif
#include "variadic_learn.h"
using namespace std;
struct Education
{
string School;
double GPA;
Education() :GPA(0.0){}
Education(const string& school, double gpa)
:School(school), GPA(gpa)
{
}
};
namespace xLearn
{
ARGS_LEARN(Education, School, GPA)
}
int main()
{
Education test = Education("MIT", 600.11);
xLearn::serialize::print_val(test);
int i = 0;
}