Guest User

Untitled

a guest
Jan 21st, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. template <typename TA, typename TB>
  2. struct MyImpl : public MyInterface
  3. {
  4. // content
  5. };
  6.  
  7. MyInterface* factory(char ta, char tb)
  8. {
  9. if(ta == 'c' && tb == 'c')
  10. {
  11. return new MyImpl<char, char>();
  12. }
  13. if(ta == 'c' && tb == 's')
  14. {
  15. return new MyImpl<char, short>();
  16. }
  17. if(ta == 's' && tb == 'c')
  18. {
  19. return new MyImpl<short, char>();
  20. }
  21. // and so on ....
  22. }
  23.  
  24. template <typename T>
  25. MyInterface * factroy(char t)
  26. {
  27. if (t == 'c') { return MyImpl<T, char>(); }
  28. if (t == 's') { return MyImpl<T, short>(); }
  29. // ...
  30. }
  31.  
  32. MyInterface * factory(char ta, char tb)
  33. {
  34. if (ta == 'c') { return factroy<char>(tb); }
  35. if (ta == 's') { return factroy<short>(tb); }
  36. // ...
  37. }
  38.  
  39. struct Base { virtual ~Base() = default; };
  40. template <typename A, typename B, typename C> struct Foo : Base { };
  41.  
  42. #include <tuple>
  43.  
  44. template <typename ...Args>
  45. constexpr Base * factory(std::tuple<Args...>)
  46. {
  47. return new Foo<Args...>;
  48. }
  49.  
  50. template <typename ...Args, typename ...Char>
  51. constexpr Base * factory(std::tuple<Args...>, char t, Char ... ts)
  52. {
  53. return t == 'c' ? make(std::tuple<char, Args...>(), ts...)
  54. : t == 's' ? make(std::tuple<short int, Args...>(), ts...)
  55. : t == 'i' ? make(std::tuple<int, Args...>(), ts...)
  56. : t == 'l' ? make(std::tuple<long int, Args...>(), ts...)
  57. : nullptr;
  58. }
  59.  
  60. struct Creator {
  61. virtual ~Creator(){};
  62. virtual Interface *create(InterfaceInner *) = 0;
  63. virtual InterfaceInner *createInner() = 0;
  64. }
  65.  
  66. std::Map<char, Creator *> creatorMap;
  67.  
  68. template<char T>
  69. struct Factory {
  70. Factory() {
  71. creatorMap.insert(T, &this->creator);
  72. }
  73. }
  74.  
  75.  
  76. template<>
  77. struct Factory<'s'> {
  78. struct ShortCreator : public Creator {
  79. virtual Interface *create(InterfaceInner *inner) {return new Impl<short>(inner);}
  80. virtual InterfaceInner *createInner(return new ImplInner<short>());
  81. } creator;
  82. }
  83.  
  84.  
  85.  
  86.  
  87. Factory<'s'> shortFactory;
  88. Factory<'c'> charFactory;
  89.  
  90. creatorMap[ta].create(creatorMap[tb].createInner());
  91.  
  92. MyInterface* factory(char ta, char tb)
  93. {
  94. switch( ta << 8 | tb )
  95. {
  96. case 'cc': return MyImpl<char, char>();
  97. case 'cs': return MyImpl<char, short>();
  98. case 'sc': return MyImpl<short, char>();
  99. // and so on ....
  100. }
  101. }
Add Comment
Please, Sign In to add comment