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

    +8

    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
    template<int ID> struct typeof_access
    {
        struct id2type; //not defined
    };
    
    template<class T, int ID> struct typeof_register : typeof_access
    {
        // define base's nested class here
        struct typeof_access::id2type
        {
            typedef T type;
        };
    };
    
    //Type registration function 
    typeof_register<T, compile-time-constant> register_type(const T&);
    
    //Actually register type by instantiating typeof_register for the correct type
    sizeof(register_type(some-type));
    
    //Use the base class to access the type.
    typedef typeof_access::id2type::type type;

    Igor Chesnokov discovered a method that allows to implement typeof on the VC series of compilers. It uses a bug in the Microsoft compiler that allows a nested class of base to be defined in a class derived from base.

    http://www.boost.org/doc/libs/1_54_0/doc/html/typeof/other.html

    Запостил: LispGovno, 03 Сентября 2013

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

    • Эксплуататоры ошибок бывают конструктивны и полезны для общества.
      Ответить
    • Я, наверное, один не понимаю, но зачем имплементить уже существующий typeof?
      Ответить
      • уже существующий лишь в некоторых компиляторах
        лень пройти по ссылке? она же даже синяя и подчеркнутая!
        Ответить
        • битая. не щёлкается
          Ответить
        • Да не лень, просто мне всегда казалось, что typeof всегда был в сипипях.
          Ответить
          • Ух какие мы ленивые... Не было его. В gcc было какое-то расширение __type_of__ или как-то так оно писалось.

            PS: Если честно так и не понял как этот странный хак typeof_access работает и каким образом он позволяет извлечь тип. И по моему тут верстка документа какие-то <...> съела.
            Ответить

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