1. C++ / Говнокод #12529

    +7

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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
    75. 75
    #include <iostream>
    namespace detail
    {
      class CRWO;
      class CRO;
      class CWO;
      class CO;
    }
    typedef detail::CRWO&  CRWO;
    typedef detail::CRO&  CRO;
    typedef detail::CWO&  CWO;
    typedef detail::CO&  CO;
    class C
    {
        friend class detail::CRWO; 
        friend class detail::CRO; 
        friend class detail::CWO; 
        friend class detail::CO; 
      public:
        C( int a ) : value(a) {}
        ~C() {};
        operator CRWO() { return *static_cast<detail::CRWO*>(static_cast<void*>(this)); }
        operator CRO() { return *static_cast<detail::CRO*>(static_cast<void*>(this)); }
        operator CWO() { return *static_cast<detail::CWO*>(static_cast<void*>(this)); }
        operator CO() { return *static_cast<detail::CO*>(static_cast<void*>(this)); }
      private:
        void set( int newValue ) { value = newValue; }
        int get() { return value; }
      private:
        int value;
    };
    class detail::CRWO
    {
      public:
        void set( int newValue ) { static_cast<C*>(static_cast<void*>(this))->set( newValue ); }
        int get() { return static_cast<C*>(static_cast<void*>(this))->get( ); }
        operator ::CRO() { return *static_cast<detail::CRO*>(static_cast<void*>(this)); }
        operator ::CWO() { return *static_cast<detail::CWO*>(static_cast<void*>(this)); }
        operator ::CO() { return *static_cast<detail::CO*>(static_cast<void*>(this)); }    
      private:
        CRWO(); CRWO(const CRWO&);~CRWO();CRWO& operator=(const CRWO&);void operator&(); void operator*();
    };
    class detail::CWO
    {
      public:
        void set( int newValue ) { static_cast<C*>(static_cast<void*>(this))->set( newValue ); }
         operator ::CO() { return *static_cast<detail::CO*>(static_cast<void*>(this)); }    
      private:
        CWO(); CWO(const CWO&);~CWO();CWO& operator=(const CWO&);void operator&(); void operator*();
    };
    class detail::CRO
    {
      public:
        int get() { return static_cast<C*>(static_cast<void*>(this))->get( ); }
        operator ::CO() { return *static_cast<detail::CO*>(static_cast<void*>(this)); }    
      private:
        CRO(); CRO(const CRO&);~CRO();CRO& operator=(const CRO&);void operator&(); void operator*();
    };
    class detail::CO
    {
      public:
      private:
        CO(); CO(const CO&);~CO();CO& operator=(const CO&);void operator&(); void operator*();
    };int main(int argc, char *argv[])
    {
    C c(3);
    CRWO rwo = c;
    CRO ro = c;
    CWO wo = c;
    CO o = c;
      std::cout  << rwo.get() << std::endl;
      wo.set( 5);
      std::cout  << ro.get() << std::endl;
    return 0;
    }

    Оттуда.

    Автор требует указывать авторство при копировании.

    Запостил: LispGovno, 02 Февраля 2013

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

    • Как на самом деле должно быть:
      #include <iostream>
      int main(int argc, char *argv[])
      {
        std::cout  << 3<< std::endl;
        wo.set( 5);
        std::cout  << 5 << std::endl;
         return 0;
      }
      Ответить
    • Это чего... Это для чего... Что это...
      Ответить
    • Синтетическая хуйня какая-то. Зачем нужны эти read-write-only, read-only, write-only и нихуя-only виды?
      #include <iostream>
      
      int main() {
          std::cout << 3 << std::endl << 5 << std::endl;
          return 0;
      }
      P.S. Если бы виды были сделаны шаблонами, я бы еще подумал, что автор пытается сконструировать что-то интересное и полезное. А так - невкусное синтетическое говно. Да и читается слишком легко, на эзотерику не потянет.
      Ответить
    • >static_cast<void*>(this)
      Так же вроде нежелательно?
      dynamic_cast<void*>(this) должно быть
      Ответить
      • Зелени не хватает
        Ответить
      • > Так же вроде нежелательно?
        Для случаев со множественным наследованием - да. Для обычных будет одинаковый результат.

        C++98, 5.2.7. Dynamic cast, пункт 7: If T is “pointer to cv void,” then the result is a pointer to the most derived object pointed to by v.

        Пример: http://ideone.com/IGn0Yt
        Ответить
    • Котаны, это из буст:
      template<size_type size> size_type push(T const (&) t);
      //Pushes as many objects from the array t as there is space available.

      T const (&) - что это означает? Как это работает вообще?
      Ответить
      • файл и строку предъяви, пока я не понимаю, как это должно вообще скомпилироваться
        Ответить
        • вот жеж http://bit.ly/125nAtg
          Ответить
          • в сорцах:
            //...
                template <size_type size>
                size_type push(T const (&t)[size])
                {
                    return push(t, size);
                }
            так что, подозреваю, какой-нибудь использованный генератор документации начудил
            Ответить
    • Ну ваще static_cast<Type*> от void* не должен быть пропущен современными компиляторами, можно сделать только через reinterpret_cast
      Ответить
      • Учите матчасть, сударь. void* прекрасно приводится static_cast'ом к указателю на любой тип. reinterpret_cast нужен как раз когда тип одного из кастуемых указателей не void*.
        Ответить
        • Что тут происходит? О чем вы, судари? Дефекейстра, глаголь устами стандарта и поведай нам о чем говорят эти чудики.
          Ответить
          • пункт 5.2.9, раздел 10 static_cast
            An rvalue of type “pointer to cv1 void” can be converted to an rvalue of type “pointer to cv2 T,” where T
            is an object type and cv2 is the same cv-qualification as, or greater cv-qualification than, cv1. A value of
            type pointer to object converted to “pointer to cv void” and back to the original pointer type will have its
            original value
            Ответить
            • По человечески заглаголил! Я тоже так считаю.
              Ответить

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