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

    +14

    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
    constexpr const char str1[] = "Anna";
    constexpr const char str2[] = "Denis";
    constexpr const char str3[] = "Vladimir";
    constexpr const char str4[] = "Alexey";
    
    constexpr const char *arr[] = { str1, str2, str3, str4 };
    
    #define GetMaxLenght(array) \
    constexpr unsigned char str_len(const char* const str) \
    {\
       return *str ? (1 + str_len(str + 1)) : 0;\
    }\
    \
    template <int index> \
    struct MaxLenght\
    {\
        static const int prev_size = MaxLenght<index-1>::max_size;\
        static const int cur_size = str_len(array[index]);\
        static const int max_size = cur_size > prev_size ? cur_size : prev_size;\
    };\
    \
    template <>\
    struct MaxLenght<-1>\
    {\
        static const int max_size = 0;\
    };\
    static const int AmountStr = sizeof(array) / sizeof(array[0]);\
    static const int array##_max_size = MaxLenght<AmountStr-1>::max_size;
    GetMaxLenght(arr);
    
    //   в *.cpp
    //   static_assert((arr_max_size == 8), "Error");

    http://habrahabr.ru/post/192736/

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

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

    • Макросоёб. Можно было без многострочного макроса.
      Ответить
      • Угу. Зачем все эти шаблоны тащить внутрь макро - непонятно. Там только в строку 28 аргументы подставляются.

        P.S. А, еще в 18й есть.
        Ответить
      • Ты просто ниасилил, лапочька?
        Ответить
        • > Ты просто ниасилил
          Ну же осилятор, дерзай, объясни нам зачем str_len описано внутри макроса ;)

          А заодно объясни нам, неосиляторам, зачем вообще нужны одноразовые макросы, которые второй раз в той же единице компиляции юзать нельзя.
          Ответить
          • > зачем вообще нужны одноразовые макросы, которые второй раз в той же единице компиляции юзать нельзя.
            #define MAKE_UNIQUE_GENERATE_CODE(_, ArgsCount, __)																								\
            		template< class T BOOST_PP_COMMA_IF(ArgsCount) BOOST_PP_ENUM_PARAMS(ArgsCount, class TArg) >													\
            		typename unique_ptr_type_generator_<T>::type make_unique_(BOOST_PP_ENUM_BINARY_PARAMS(ArgsCount, const TArg, & Arg ))							\
            		{																																				\
            			return typename unique_ptr_type_generator_<T>::type(new T(BOOST_PP_ENUM_PARAMS(ArgsCount, Arg)));											\
            		}
            
            		BOOST_PP_REPEAT(MAX_ARGS_AT_MAKE_UNIQUE, MAKE_UNIQUE_GENERATE_CODE, _)
            		#undef MAKE_UNIQUE_GENERATE_CODE
            MAKE_UNIQUE_GENERATE_CODE - употреблён один раз
            Ответить
            • Что-то мне намекает, что из-за repeat'а совсем не один ;)
              Ответить
          • Не люблю макросы. Такое ощущение, что кто-то кричит на меня из исходного кода
            Ответить
    • А теперь возьмём максимальный элемент двух массивов, ага. Феерическое долбоёбство.
      Ответить
      • А все из-за того, что constexpr функции требуют не чистоты функции (которой вполне достаточно для вычислимости на этапе компиляции), а соблюдения прокрустовых ограничений... Да, не кастрированные constexpr функции усложнили бы компилятор, серьезно усложнили, т.к. пришлось бы прикручивать интерпретацию некоего подмножества с++... Зато у нас были бы нормальные компайл-тайм вычисления, а не изъебства с сотней никому не нужных структур и шаблонов...
        Ответить
        • всё потому, что программисты на C++ должны СТРАДАТЬ
          Ответить
          • Да не усложняйте себе жизнь - я вообще всегда отбрасываю решение которое мне кажется сложным, в С++ море возможность, как жить легко, так и заниматся Сизифовым трудом - стремитесь к простым решениям (не примитивним).
            Ответить
            • показать все, что скрытопрограммисты на C++ должны СТРАДАТЬ

              У меня член встал.
              Ответить
              • >программисты на C++ должны СТРАДАТЬ
                это Польша должна страдать
                Ответить
                • А Ляхи тут при чем?
                  Ответить
                  • Loki? Самое непосредственное. Код посмотри и поймёшь почему. Копипаста на копипасте. Несут свой крест.
                    Ответить
            • я не усложняю, наоборот. Это вон умельцы с хабры себе жизнь усложняют.
              Ответить
              • Только у меня что-то случилось со ссылками на ГК?

                Вместо http://govnokod.ru/comments проставляется http://govnokod.ru./comments.
                Ответить
          • Всё хоrошо паrни, в С++ё4 собиrаются rазrешить в constexpr менять локальные пеrеменные и уйдет дурацкое огrаничение в одно выражение на функцию.
            Ответить

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