Guest User

Untitled

a guest
Nov 23rd, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.08 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3.  
  4. //#define USE_TRANS_PART_HELPER // activate to see my non compiling trials
  5.  
  6. struct PartA;
  7. struct PartB;
  8.  
  9. // there are serveral variants of the PartTransformer doing different output for Part-Variants
  10.  
  11. struct PartTransformer
  12. {
  13. virtual void TransformPartA(const PartA& part) = 0;
  14. virtual void TransformPartB(const PartB& part) = 0;
  15. };
  16.  
  17. struct Part {
  18. virtual void Transform(PartTransformer& transformer) const = 0;
  19. };
  20.  
  21. struct PartA : Part {
  22. // specials content of PartA...
  23. double _value;
  24. PartA(const double value) :_value(value) {}
  25. void Transform(PartTransformer& transformer) const override {
  26. transformer.TransformPartA(*this);
  27. }
  28. };
  29.  
  30. #ifndef USE_TRANS_PART_HELPER
  31.  
  32. struct PartB : Part {
  33. // specials content of PartB...
  34. int _value;
  35. PartB(const int value) :_value(value) {}
  36. void Transform(PartTransformer& transformer) const override {
  37. transformer.TransformPartB(*this);
  38. }
  39. };
  40.  
  41. #else
  42.  
  43. // QUESTION !!! // is is possible to have some sort of Tranform-Write helper template // that is specialized with only the to call transformer-method?
  44. // sort of - following does not compile :(
  45. template<typename Method> struct TransPart : Part {
  46. void Transform(PartTransformer& transformer) const override {
  47. (transformer.*Method)(*this);
  48. }
  49. }
  50.  
  51. struct PartB : TransPart<PartTransformer::TransformPartB>
  52. {
  53. // specials content of PartB...
  54. int _value;
  55. PartB(const int value) :_value(value) {}
  56. // Transform should be implemented by TransPart template
  57. };
  58.  
  59. #endif
  60.  
  61. struct PrintPartTransformer : PartTransformer {
  62. virtual void TransformPartA(const PartA& part) {
  63. std::cout << "TransformPartA : double value: " << part._value << std::endl;
  64. }
  65. virtual void TransformPartB(const PartB& part) {
  66. std::cout << "TransformPartB : int value: " << part._value << std::endl;
  67. }
  68. };
  69.  
  70. int main() {
  71. std::vector<Part*> parts;
  72. // power leaking :) parts.push_back(new PartA(12.33)); parts.push_back(new PartB(1233));
  73. PrintPartTransformer transformer;
  74. for (const auto& part : parts) {
  75. part->Transform(transformer);
  76. }
  77. }
Advertisement
Add Comment
Please, Sign In to add comment