null1.hh
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:2k
源码类别:

模拟服务器

开发平台:

C/C++

  1. #ifndef __null1_hh__
  2. #define __null1_hh__
  3. #include <ostream>
  4. using namespace std;
  5. #include "define_short.h"
  6. //! with_class = Null
  7. //: Thrown when a *Null* value is trying to be converted into a type 
  8. //: it can't convert to.
  9. class BadNullConversion {};
  10. class null_type {
  11. public:
  12.   template <class Type> operator Type () {throw BadNullConversion();}
  13. };
  14. //: 
  15. const null_type null = null_type();
  16. //: Type to use for the behavior parameter for *Null<>*
  17. struct NullisNull {
  18.   static null_type null_is() {return null_type();}
  19.   static ostream&  null_ostr(ostream& o) {o << "(NULL)"; return o;}
  20. };
  21. //: Type to use for the behavior parameter for *Null<>*
  22. struct NullisZero {
  23.   static int   null_is() {return 0;}
  24.   static ostream& null_ostr(ostream &o) {o << 0; return o;}
  25. };
  26. //: Type to use for the behavior parameter for *Null<>*
  27. struct NullisBlank {
  28.   static const char * null_is() {return "";}
  29.   static ostream& null_ostr(ostream &o) {o << ""; return o;}
  30. };
  31. //: Container class for holding null types.
  32. template <class Type, class Behavior = NullisNull>
  33. class Null {
  34. public:
  35.   Type data;
  36.   bool is_null;
  37.   typedef Type value_type;
  38. public:
  39.   Null () {} //:
  40.   Null (Type x) : data(x), is_null(false) {} 
  41.   //: 
  42.   Null (const null_type &n) : is_null(true) {} 
  43.   //: Gives Null the null value
  44.   // Note: the global const *null* (not NULL) is of value null_type thus 
  45.   // you can say something like *Null<Type> x = null*.
  46.   operator Type& () { 
  47.     if (is_null) return data = Behavior::null_is();
  48.     else return data; } 
  49.   //:
  50.   Null& operator = (const Type &x) {data = x; is_null = false; return *this;}
  51.   //: 
  52.   Null& operator = (const null_type &n) {is_null = true; return *this;}
  53.   //:
  54. };
  55. //: OEP - Specialization for <void>
  56. template <> class Null<void> {
  57. public:
  58.   bool is_null;
  59.   typedef void value_type;
  60. public:
  61.   Null () : is_null(false) {} 
  62.   //: 
  63.   Null (const null_type &n) : is_null(true) {} 
  64.   //: Gives Null the null value
  65.   // Note: the global const *null* (not NULL) is of value null_type thus 
  66.   // you can say something like *Null<Type> x = null*.
  67.   //:
  68.   Null& operator = (const null_type &n) {is_null = true; return *this;}
  69.   //:
  70. };
  71.  
  72. #endif