Кресты / Говнокод #6531 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
typedef union Variant
    {
    public:
        Variant() {}

        Variant(signed int val) :
            v_int(val)
        {}
        operator signed int &() { return const_cast<signed int&>(this->operator const signed int &()); }
        operator const signed int&() const { return v_int; }

        Variant(unsigned int val) :
            v_uint(val)
        {}
        operator unsigned int &() { return const_cast<unsigned int&>(this->operator const unsigned int &()); }
        operator const unsigned int &() const { return v_uint; }

        Variant(char val) :
            v_char(val)
        {}
        operator char &() { return const_cast<char&>(this->operator const char &()); }
        operator const char&() const { return v_char; }

        Variant(double val) :
            v_float(val)
        {}
        operator double &() { return const_cast<double&>(this->operator const double &()); }
        operator const double &() const { return v_float; }

        Variant(void *val) :
            v_ptr(val)
        {}
        operator void*& () { return const_cast<void*&>(this->operator void *&()); }
        operator const void* const& () const { return v_ptr; }

        static size_t getValueSize(const Type::OfType &type)
        {
            size_t result = 0;
            switch ( type )
            {
            case Type::Pointer:
            case Type::CharPtr:
            case Type::IntPtr:
            case Type::UIntPtr:
            case Type::RealPtr:
            case Type::String:
                result = sizeof(v_ptr);
                break;
            case Type::Char:
                result = sizeof(v_char);
                break;
            case Type::Int:
                result = sizeof(v_int);
                break;
            case Type::UInt:
                result = sizeof(v_uint);
                break;
            case Type::Real:
                result = sizeof(v_float);
                break;
            case Type::Void:
                result = 0;
                break;
            }
            return result;
        }

    private:
        void* v_ptr;
        char v_char;
        unsigned int v_uint;
        signed int v_int;
        double v_float;
    } Variant;

Небольшая имплементация безтиповости ;-[

Запостил: Elvenfighter Elvenfighter, (Updated )

Комментарии (17) RSS

  • если это все варианты, то говно
    в настоящем варианте их на один только char должно быть 3:
    1)char
    2)signed char
    3)unsigned char
    Ответить
  • такие задачи проще через темплейты решать...
    Ответить
    • >такие задачи проще через темплейты решать...
      неа. тогда придёться кастить через указатель. это не тако уж плохое решение

      вообще, ума не приложу, где этот паттерн может понадобится?
      Ответить
      • >вообще, ума не приложу, где этот паттерн может понадобится?
        я реализовывал подобный паттерн, когда делал свой интерпретатор слабо-типизированного языка... для совместимости виртуального типа со стандартными цпп-шными типами... во всяких интерфейсах к объектам может еще пригодиться... да много где, если так подумать)
        Ответить
  • А где ассерт на случай, если записали туда int, а прочитали char?
    Кстати, как такой вариант будет работать для классов? Их же из-за автодеструкторов нельзя в юнионы писать.
    Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8