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

    +6

    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
    //		implicit_cast< >
    // I believe this was originally going to be in the C++ standard but 
    // was left out by accident. It's even milder than static_cast.
    // I use it instead of static_cast<> to emphasize that I'm not doing
    // anything nasty. 
    // Usage is identical to static_cast<>
    template <class OutputClass, class InputClass>
    inline OutputClass implicit_cast(InputClass input){
    	return input;
    }
    
    //		horrible_cast< >
    // This is truly evil. It completely subverts C++'s type system, allowing you 
    // to cast from any class to any other class. Technically, using a union 
    // to perform the cast is undefined behaviour (even in C). But we can see if
    // it is OK by checking that the union is the same size as each of its members.
    // horrible_cast<> should only be used for compiler-specific workarounds. 
    // Usage is identical to reinterpret_cast<>.
    
    // This union is declared outside the horrible_cast because BCC 5.5.1
    // can't inline a function with a nested class, and gives a warning.
    template <class OutputClass, class InputClass>
    union horrible_union{
    	OutputClass out;
    	InputClass in;
    };
    
    template <class OutputClass, class InputClass>
    inline OutputClass horrible_cast(const InputClass input){
    	horrible_union<OutputClass, InputClass> u;
    	// Cause a compile-time error if in, out and u are not the same size.
    	// If the compile fails here, it means the compiler has peculiar
    	// unions which would prevent the cast from working.
    	typedef int ERROR_CantUseHorrible_cast[sizeof(InputClass)==sizeof(u) 
    		&& sizeof(InputClass)==sizeof(OutputClass) ? 1 : -1];
    	u.in = input;
    	return u.out;
    }

    Боль и страдание шаблонного программирования на С++98. Комменты и названия доставляют.

    Запостил: gorthauer87, 11 Марта 2016

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

    • template <typename T1, typename T2>
      inline T1 i_dont_give_a_fuck_cast(T2 value) {
          return (T1)T2;
      }
      Ответить
      • return (T1)value; же
        Ответить
      • а почему не просто reinterpret_cast?
        Ответить
        • reinterpret_cast слишком ограниченный. Например float в int не кастует. А сишный может кастовать всё...
          Ответить
          • в смысле который (T)value_T2?
            Ответить
            • Да. Поэтому его и распилили на 3 разных каста (dynamic не в счёт).
              Ответить
    • horrible_cast UB_cast
      Ответить
      • я все время в первого раза читаю UB как... ну вообщем: ЁБ_cast
        Ответить
    • function InputClass_To_OutputClass is
         new Ada.Unchecked_Conversion (
            Source => InputClass,
            Target => OutputClass);
      Ответить
    • Не вижу ничего ужасного. Все КРЕСТОПРОБЛЕМЫ тут от скрещивания с сишным наследием.

      Дали достаточно веревки чтобы выстрелить в ногу - люди недовольны. Не дали - тоже недовольны. Во всяких жабах через unsafe тоже можно unionы эмулировать и натворить делов.
      Ответить
      • проблема плюсов только в том, что люди, которые при наличии пистолета первым делом пытаются застрелиться, пытаются писать на языке со встроенным пистолетом.
        Ответить
        • >что люди, которые при наличии пистолета первым делом пытаются

          У тебя есть пистолет и голова. О чём ты первым делом подумаешь?
          Ответить
          • Протестировать пистолет на голове кого-нибудь другого перед тем как думать, стоит ли использовать на своей.
            Ответить
          • Где достать патроны
            Ответить
            • https://en.wikipedia.org/wiki/Pistol-whipping
              Ответить
              • как говорил Борис Бритва:
                Тяжесть - это хорошо. Тяжесть - это надежно. Даже если не выстрелит, таким всегда можно врезать по башке.
                Ответить
    • >// I believe this was originally going to be in the C++ standard but was left out by accident.
      Запости реализацию этого всего
      Ответить

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