fork download
  1. #include <iostream>
  2. #include <set>
  3.  
  4.  
  5. template <typename Content>
  6. struct SetWith {
  7. std::set<Content> set;
  8. };
  9.  
  10. template <typename... Contents>
  11. struct SetsContainer {};
  12.  
  13. template <typename Content, typename... OtherContents>
  14. struct SetsContainer<Content, OtherContents...> : public SetsContainer<OtherContents...>, public SetWith<Content> {};
  15.  
  16. template <typename... Contents>
  17. struct Sets {
  18. SetsContainer<Contents...> sets;
  19. template <typename C>
  20. std::set<C> & set_of(void) {
  21. return static_cast<SetWith<C> *>(&sets)->set;
  22. }
  23. template <typename T>
  24. void add(T t) {
  25. set_of<typename std::decay<T>::type>().insert(std::forward<T>(t));
  26. }
  27. };
  28.  
  29. template <typename C, typename Container>
  30. std::set<C> & set_of(Container & sets) {
  31. return static_cast<SetWith<C> *>(&sets)->set;
  32. }
  33.  
  34. struct Foo {};
  35.  
  36. int main() {
  37. Sets<int, double, bool> s;
  38. SetsContainer<int, char, bool> s2;
  39. s.set_of<int>().insert(42);
  40. s.set_of<double>().insert(3.14);
  41. s.set_of<bool>().insert(true);
  42. s.add(1.0);
  43. s.add(3);
  44. double const ddd = 6.28;
  45. s.add(ddd);
  46. double xyz = 0.001;
  47. s.add(std::move(xyz));
  48. for (auto const & d : s.set_of<double>()) {
  49. std::cout << d << ", ";
  50. }
  51. std::cout << std::endl;
  52. set_of<bool>(s2).insert(false);
  53. // s.get<Foo>();
  54. return 0;
  55. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
0.001, 1, 3.14, 6.28,