fork download
  1. #include <string>
  2. #include <iostream>
  3.  
  4. #define static_type(name) static constexpr const char* type_name() { return name; }
  5.  
  6. struct disabled_type { static_type("disabled"); };
  7.  
  8. struct deferred_type { static_type("deferred"); };
  9. struct deferred_type_2 { static_type("deferred2!"); };
  10.  
  11. struct deadline_type { static_type("deadline"); };
  12. struct deadline_type_2 { static_type("deadline2!"); };
  13.  
  14. template <typename T = deferred_type>
  15. struct deferred_tag { typedef T type; };
  16.  
  17. template <typename T = deadline_type>
  18. struct deadline_tag {typedef T type; };
  19.  
  20. template<template <class> class Expected, typename...T>
  21. struct match { typedef disabled_type type; };
  22.  
  23. template <typename V, template <class> class Expected, typename...T>
  24. struct match<Expected, Expected<V>, T...> { typedef typename Expected<V>::type type; };
  25.  
  26. template <template <class> class Expected, typename Actual, typename...T>
  27. struct match<Expected, Actual, T...> { typedef typename match<Expected, T...>::type type; };
  28.  
  29.  
  30. template<class T, typename... Plugins>
  31. struct container
  32. {
  33. typedef typename match<deferred_tag, Plugins...>::type deferred_;
  34. typedef typename match<deadline_tag, Plugins...>::type deadline_;
  35.  
  36. static std::string type_name()
  37. {
  38. return std::string("container<") + deferred_::type_name() + ", " + deadline_::type_name() + ">";
  39. }
  40. };
  41.  
  42. int main()
  43. {
  44. using namespace std;
  45. cout << container<int>::type_name() << std::endl;
  46. cout << container<int, deadline_tag<deadline_type>>::type_name() << std::endl;
  47. cout << container<int, deferred_tag<deferred_type>>::type_name() << std::endl;
  48. cout << container<int, deferred_tag<deferred_type>, deadline_tag<deadline_type>>::type_name() << std::endl;
  49. cout << container<int, deadline_tag<deadline_type>, deferred_tag<deferred_type>>::type_name() << std::endl;
  50.  
  51. cout << container<int, deadline_tag<deadline_type_2>, deferred_tag<deferred_type_2>>::type_name() << std::endl;
  52. cout << container<int, deadline_tag<deadline_type_2>>::type_name() << std::endl;
  53. cout << container<int, deferred_tag<deferred_type_2>, deadline_tag<>>::type_name() << std::endl;
  54. }
  55.  
Success #stdin #stdout 0s 3436KB
stdin
Standard input is empty
stdout
container<disabled, disabled>
container<disabled, deadline>
container<deferred, disabled>
container<deferred, deadline>
container<deferred, deadline>
container<deferred2!, deadline2!>
container<disabled, deadline2!>
container<deferred2!, deadline>