Advertisement
Guest User

Untitled

a guest
May 24th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.97 KB | None | 0 0
  1. #pragma once
  2. #include <iostream>
  3. #include <mutex>
  4.  
  5. struct nonesuch {
  6.     nonesuch() = delete;
  7.     ~nonesuch() = delete;
  8.     nonesuch(nonesuch const&) = delete;
  9.     void operator=(nonesuch const&) = delete;
  10. };
  11.  
  12. namespace detail {
  13.     template <class Default, class AlwaysVoid,
  14.         template<class...> class Op, class... Args>
  15.     struct detector {
  16.         using value_t = std::false_type;
  17.         using type = Default;
  18.     };
  19.  
  20.     template <class Default, template<class...> class Op, class... Args>
  21.     struct detector<Default, std::void_t<Op<Args...>>, Op, Args...> {
  22.         // Note that std::void_t is a C++17 feature
  23.         using value_t = std::true_type;
  24.         using type = Op<Args...>;
  25.     };
  26.  
  27. } // namespace detail
  28.  
  29. template <template<class...> class Op, class... Args>
  30. using is_detected = typename detail::detector<nonesuch, void, Op, Args...>::value_t;
  31.  
  32. template <template<class...> class Op, class... Args>
  33. using detected_t = typename detail::detector<nonesuch, void, Op, Args...>::type;
  34.  
  35. template <class Default, template<class...> class Op, class... Args>
  36. using detected_or = detail::detector<Default, void, Op, Args...>;
  37.  
  38. template<typename T>
  39. using to_string_expression = decltype(std::declval<T>().toString());
  40.  
  41. template<typename T>
  42. constexpr bool has_to_string = is_detected<to_string_expression, T>::value;
  43.  
  44. template<class T, typename std::enable_if<has_to_string<T>, int>::type = 0>
  45. std::ostream& operator<<(std::ostream& out, T t) {
  46.     return out << t.toString();
  47. }
  48.  
  49. std::ostream& print_one(std::ostream& os);
  50.  
  51. template <class A0, class ...Args>
  52. std::ostream& print_one(std::ostream& os, const A0& a0, const Args& ...args) {
  53.     os << a0;
  54.     return print_one(os, args...);
  55. }
  56.  
  57. template <class ...Args>
  58. std::ostream& print(std::ostream& os, const Args& ...args) {
  59.     return print_one(os, args...);
  60. }
  61.  
  62. std::mutex& get_cout_mutex();
  63.  
  64. template <class ...Args>
  65. std::ostream& print(const Args& ...args) {
  66.     std::lock_guard<std::mutex> _(get_cout_mutex());
  67.     return print(std::cout, args...) << std::endl;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement