fork(1) download
  1. #include <iostream>
  2. #include <cstring>
  3. #include <memory>
  4.  
  5. struct Base { virtual const char *getName() = 0; virtual ~Base() = default; };
  6. struct SE_0 : Base { virtual const char *getName() override { return "SE_0"; } };
  7. struct SE_1 : Base { virtual const char *getName() override { return "SE_1"; } };
  8. struct SE_2 : Base { virtual const char *getName() override { return "SE_2"; } };
  9.  
  10. enum TypesEnum {
  11. E__BEGIN = 0,
  12.  
  13. E_0 = E__BEGIN,
  14. E_1,
  15. E_2,
  16.  
  17. E__END
  18. };
  19.  
  20. template<TypesEnum>
  21. struct Registry {};
  22.  
  23. template<>
  24. struct Registry<E_0> {
  25. static constexpr const char *name = "The first type (SE_0)";
  26. using type = SE_0;
  27. };
  28.  
  29. template<>
  30. struct Registry<E_1> {
  31. static constexpr const char *name = "A second type (SE_1)";
  32. using type = SE_1;
  33. };
  34.  
  35. template<>
  36. struct Registry<E_2> {
  37. static constexpr const char *name = "And the last type (SE_2)";
  38. using type = SE_2;
  39. };
  40.  
  41. template<TypesEnum CurrentType>
  42. std::unique_ptr<Base> createTypeImpl(const char *name)
  43. {
  44. if constexpr (CurrentType < E__END) {
  45. if (strstr(Registry<CurrentType>::name, name)) {
  46. return std::make_unique<typename Registry<CurrentType>::type>();
  47. }
  48. return createTypeImpl<static_cast<TypesEnum>(CurrentType + 1)>(name);
  49. } else {
  50. (void)name; // Silence 'unreferenced formal parameter' warning
  51. return nullptr;
  52. }
  53. }
  54.  
  55. std::unique_ptr<Base> createType(const char *name)
  56. {
  57. return createTypeImpl<E__BEGIN>(name);
  58. }
  59.  
  60. int main()
  61. {
  62. std::cout << "first type: " << createType("first type")->getName() << std::endl;
  63. std::cout << "second type: " << createType("second type")->getName() << std::endl;
  64. std::cout << "last type: " << createType("last type")->getName() << std::endl;
  65.  
  66. return EXIT_SUCCESS;
  67. }
  68.  
  69.  
Success #stdin #stdout 0s 4436KB
stdin
Standard input is empty
stdout
first type: SE_0
second type: SE_1
last type: SE_2