fork download
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. #include <tuple>
  5. #include <type_traits>
  6.  
  7. template<typename T>
  8. struct IsOn
  9. {
  10. T *pt;
  11. bool isOn;
  12. IsOn(T& t, bool b):pt(&t), isOn(b) {}
  13. };
  14.  
  15. template <typename ... Ts>
  16. struct tmy
  17. {
  18. std::tuple<std::vector<IsOn<Ts>>...> vs;
  19. };
  20.  
  21. namespace detail
  22. {
  23. template <typename T1, typename T2>
  24. void print(std::vector<IsOn<T1>>& v, T2& t)
  25. {
  26. for (auto&& e : v) {
  27. if (e.isOn) {
  28. (*e.pt) << t;
  29. }
  30. }
  31. }
  32.  
  33. template <std::size_t ... Is, typename Tuple, typename T>
  34. void print(std::index_sequence<Is...>, Tuple& tuple, T& t)
  35. {
  36. int dummy[] = {0, (print(std::get<Is>(tuple), t), 0)...};
  37. static_cast<void>(dummy); // avoid warning for unused variable
  38. }
  39.  
  40. }
  41.  
  42. template<typename ...Ts, typename T>
  43. tmy<Ts...>& operator<<(tmy<Ts...>& rt,T& t) {
  44. detail::print(std::index_sequence_for<Ts...>{}, rt.vs, t);
  45. return rt;
  46. }
  47.  
  48. int main()
  49. {
  50. tmy<std::ostream, std::ostream> my;
  51. std::get<0>(my.vs).push_back(IsOn<std::ostream>(std::cout, true));
  52. std::get<0>(my.vs).push_back(IsOn<std::ostream>(std::cerr, false));
  53. std::get<1>(my.vs).push_back(IsOn<std::ostream>(std::cout, true));
  54. my<<"hi twice!";
  55. }
  56.  
Success #stdin #stdout 0s 3228KB
stdin
Standard input is empty
stdout
hi twice!hi twice!