fork download
  1. #include<memory>
  2. #include<iostream>
  3. #include<type_traits>
  4. using namespace std;
  5.  
  6.  
  7.  
  8. template<typename T, typename... types>
  9. struct T_fabric
  10. {
  11. enum {size = sizeof...(types)};
  12. T_fabric<types...> fabric;
  13.  
  14. template < size_t N,
  15. class Tc = typename enable_if<size == N, T>::type>
  16. shared_ptr<Tc> create() { return make_shared<Tc>(); }
  17.  
  18. template < size_t N,
  19. class Tc = typename enable_if<size != N, T>::type>
  20. auto create() -> decltype(fabric.create<N>()) { return fabric.create<N>(); }
  21. };
  22.  
  23. template<typename T>
  24. struct T_fabric<T> {
  25. template < size_t N,
  26. class = typename enable_if<0 == N>::type>
  27. shared_ptr<T> create() { return make_shared<T>(); }
  28. };
  29.  
  30.  
  31. int main() {
  32. T_fabric<double, float, int> fabric;
  33.  
  34. auto v0 = *(fabric.create<0>());
  35. auto v1 = *(fabric.create<1>());
  36. auto v2 = *(fabric.create<2>());
  37.  
  38. std::cout << "v0: " << typeid(v0).name() << '\n';
  39. std::cout << "v1: " << typeid(v1).name() << '\n';
  40. std::cout << "v2: " << typeid(v2).name() << '\n';
  41.  
  42.  
  43. return 0;
  44. }
Success #stdin #stdout 0s 3032KB
stdin
Standard input is empty
stdout
v0: i
v1: f
v2: d