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 { static_type("disabled"); };
  7. struct deferred { static_type("deferred"); };
  8. struct deadline { static_type("deadline"); };
  9.  
  10. template<typename Expected, typename...T>
  11. struct match { typedef disabled type; };
  12.  
  13. template <typename Expected, typename...T>
  14. struct match<Expected, Expected, T...> { typedef Expected type; };
  15.  
  16. template <typename Expected, typename Actual, typename...T>
  17. struct match<Expected, Actual, T...> { typedef typename match<Expected, T...>::type type; };
  18.  
  19.  
  20. template<class T, typename... Plugins>
  21. struct container
  22. {
  23. typedef typename match<deferred, Plugins...>::type deferred_;
  24. typedef typename match<deadline, Plugins...>::type deadline_;
  25.  
  26. static std::string type_name()
  27. {
  28. return std::string("container<") + deferred_::type_name() + ", " + deadline_::type_name() + ">";
  29. }
  30. };
  31.  
  32. int main()
  33. {
  34. using namespace std;
  35. cout << container<int>::type_name() << std::endl;
  36. cout << container<int, deadline>::type_name() << std::endl;
  37. cout << container<int, deferred>::type_name() << std::endl;
  38. cout << container<int, deferred, deadline>::type_name() << std::endl;
  39. cout << container<int, deadline, deferred>::type_name() << std::endl;
  40. }
Success #stdin #stdout 0s 3432KB
stdin
Standard input is empty
stdout
container<disabled, disabled>
container<disabled, deadline>
container<deferred, disabled>
container<deferred, deadline>
container<deferred, deadline>