00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00026 #ifndef LIBCWD_CWPRINT_H
00027 #define LIBCWD_CWPRINT_H
00028
00029 namespace libcwd {
00030
00031
00032
00033
00034
00035 template<class PRINTABLE_OBJECT>
00036 class cwprint_tct {
00037 private:
00038 PRINTABLE_OBJECT const& M_printable_object;
00039 public:
00040 cwprint_tct(PRINTABLE_OBJECT const& printable_object) : M_printable_object(printable_object) { }
00041
00042 friend
00043 inline
00044 std::ostream&
00045 operator<<(std::ostream& os, cwprint_tct<PRINTABLE_OBJECT> const& __cwprint)
00046 {
00047 __cwprint.M_printable_object.print_on(os);
00048 return os;
00049 }
00050 };
00051
00085 template<class T>
00086 inline
00087 cwprint_tct<T>
00088 cwprint(T const& printable_object)
00089 {
00090 return cwprint_tct<T>(printable_object);
00091 }
00092
00093
00094
00095
00096
00097 template<class PRINTABLE_OBJECT>
00098 class cwprint_using_tct {
00099 typedef void (PRINTABLE_OBJECT::* print_on_method_t)(std::ostream&) const;
00100 private:
00101 PRINTABLE_OBJECT const& M_printable_object;
00102 print_on_method_t M_print_on_method;
00103 public:
00104 cwprint_using_tct(PRINTABLE_OBJECT const& printable_object, print_on_method_t print_on_method) :
00105 M_printable_object(printable_object), M_print_on_method(print_on_method) { }
00106
00107 friend
00108 inline
00109 std::ostream&
00110 operator<<(std::ostream& os, cwprint_using_tct<PRINTABLE_OBJECT> __cwprint_using)
00111 {
00112 (__cwprint_using.M_printable_object.*__cwprint_using.M_print_on_method)(os);
00113 return os;
00114 }
00115 };
00116
00150
00151
00152
00153
00154
00155 template<class T, class T_OR_BASE_OF_T>
00156 inline
00157 cwprint_using_tct<T_OR_BASE_OF_T>
00158 cwprint_using(T const& printable_object, void (T_OR_BASE_OF_T::*print_on_method)(std::ostream&) const)
00159 {
00160 T_OR_BASE_OF_T const& base(printable_object);
00161 return cwprint_using_tct<T_OR_BASE_OF_T>(base, print_on_method);
00162 }
00163
00164 }
00165
00166 #endif // LIBCWD_CWPRINT_H