fork(4) download
  1. #include <memory>
  2.  
  3. template<typename> class FactoryImpl;
  4.  
  5. template<> class FactoryImpl<void> {
  6. struct secret { };
  7. friend class Base;
  8. };
  9.  
  10. template<typename T>
  11. class FactoryImpl : T {
  12. public:
  13. template<typename... Args>
  14. static std::unique_ptr<class Base> create (Args&&... args) {
  15. return std::unique_ptr<class Base> (new FactoryImpl (std::forward<Args> (args) ...));
  16. }
  17.  
  18. private:
  19. template<typename... Args>
  20. FactoryImpl (Args&&... args)
  21. : T (std::forward<Args> (args) ... )
  22. { }
  23.  
  24. virtual void _not_allowed (FactoryImpl<void>::secret) { };
  25. };
  26.  
  27. class Base {
  28. public:
  29. virtual ~Base () { }
  30.  
  31. private:
  32. virtual void _not_allowed (FactoryImpl<void>::secret) = 0;
  33. };
  34.  
  35. template<typename T, typename... Args>
  36. std::unique_ptr<Base> factory (Args&&... args) {
  37. return FactoryImpl<T>::create (std::forward<Args> (args) ...);
  38. }
  39.  
  40.  
  41. struct Derived : Base {
  42. Derived () { }
  43. Derived (int i) { }
  44. };
  45.  
  46.  
  47. int
  48. main (int argc, char *argv[])
  49. {
  50. factory<Derived> ();
  51. factory<Derived> (123);
  52.  
  53. // Derived d; // <- ERROR
  54. }
  55.  
Success #stdin #stdout 0s 3424KB
stdin
Standard input is empty
stdout
Standard output is empty