fork download
  1. #include <iostream>
  2.  
  3. struct Reader {
  4. virtual void action() = 0;
  5. };
  6.  
  7. struct Writer {
  8. virtual void action() = 0;
  9. };
  10.  
  11. struct ReadWriter {
  12.  
  13. int i;
  14.  
  15. struct ReaderAdapter : Reader {
  16. ReadWriter *rw;
  17.  
  18. ReaderAdapter( ReadWriter *rw ) : rw( rw ) {}
  19.  
  20. void action() override {
  21. rw->read_action();
  22. }
  23. } reader;
  24.  
  25. struct WriterAdapter : Writer {
  26. ReadWriter *rw;
  27.  
  28. WriterAdapter( ReadWriter *rw ) : rw( rw ) {}
  29.  
  30. void action() override {
  31. rw->write_action();
  32. }
  33. } writer;
  34.  
  35. ReadWriter( int i = 0 ) : i( i ), reader( this ), writer( this ) {}
  36.  
  37. void read_action() {
  38. std::cout << "reader " << i << "\n";
  39. }
  40.  
  41. void write_action() {
  42. std::cout << "writer " << i << "\n";
  43. }
  44.  
  45. operator Reader*() {
  46. return &this->reader;
  47. }
  48.  
  49. operator Writer*() {
  50. return &this->writer;
  51. }
  52. };
  53.  
  54. void use_reader( Reader* reader ) {
  55. reader->action();
  56. }
  57.  
  58. void use_writer( Writer* writer ) {
  59. writer->action();
  60. }
  61.  
  62. int main() {
  63. ReadWriter rw( 10 );
  64.  
  65. use_reader( rw );
  66. use_writer( rw );
  67.  
  68. return 0;
  69. }
  70.  
Success #stdin #stdout 0s 3456KB
stdin
Standard input is empty
stdout
reader 10
writer 10