fork(1) download
  1. #include <iostream>
  2. #include <string>
  3. #include <list>
  4. using namespace std;
  5.  
  6. namespace szn
  7. {
  8.  
  9. // istream/ostream is a substiture for actual streaming media
  10.  
  11. template<class C>
  12. class able_base
  13. {
  14. public:
  15. virtual void marshall ( ostream&, const C& ) const = 0;
  16. virtual void unmarshall ( C&, istream& ) const = 0;
  17. };
  18.  
  19. template<class T,class C> class generic_member_wrapper : public able_base<C>
  20. {
  21. T C::*_m;
  22. public:
  23. generic_member_wrapper ( T C::*member_ptr ) : _m(member_ptr) {}
  24. void marshall ( ostream& s, const C& c ) const override { s << c.*_m << ';'; }
  25. void unmarshall ( C& c, istream& s ) const override { s >> c.*_m; }
  26. };
  27.  
  28. template<class T,class C>
  29. able_base<C>* able_member ( T C::*member_ptr )
  30. {
  31. return new generic_member_wrapper<T,C> ( member_ptr );
  32. }
  33.  
  34.  
  35. template<class C>
  36. class marshaller
  37. {
  38. list<szn::able_base<C>*> _smembers;
  39. public:
  40. marshaller ( initializer_list<able_base<C>*> il ) : _smembers(il) {}
  41.  
  42. void marshall ( ostream& s, const C& c ) const
  43. {
  44. for ( auto smember: _smembers )
  45. smember->marshall ( s, c );
  46. }
  47. void unmarshall ( C& c, istream& s ) const
  48. {
  49. for ( auto smember: _smembers )
  50. smember->unmarshall ( c, s );
  51. }
  52. };
  53.  
  54. }
  55.  
  56. // USE
  57.  
  58. struct Data1
  59. {
  60. int _m1;
  61. bool _m2;
  62. string _m3;
  63.  
  64. static szn::marshaller<Data1> s_mr;
  65. };
  66.  
  67. szn::marshaller<Data1> Data1::s_mr ( {
  68. szn::able_member(&Data1::_m1),
  69. szn::able_member(&Data1::_m2),
  70. szn::able_member(&Data1::_m3)
  71. } );
  72.  
  73. //Data1::s_serializer = Serializer ( {Data1::_m1, Data1::_m2, Data1::_m3} );
  74.  
  75.  
  76. int main()
  77. {
  78. Data1 d1 = { 31415, true, "the big red fox" };
  79. Data1::s_mr.marshall ( cout, d1 );
  80. return 0;
  81. }
Success #stdin #stdout 0s 3276KB
stdin
Standard input is empty
stdout
31415;1;the big red fox;