Иван Андреевич (diente_de_lion) wrote,
Иван Андреевич
diente_de_lion

Прямо сам от себя прусь

Люблю это состояние, когда сделаю чего-нибудь и сам от себя балдею какой я умный и вообще :) Нет, понятно, и поумнее меня есть люди, но чего бы за самого себя не порадоваться если хочется? :)

Вот вчера вечером понадобилось решить задачку. Перевести число в строковое представление. Ну то есть на входе у нас число 125, а на выходе строка "сто двадцать пять". Вроде все просто. Но писать тупые скучные алгоритмы не хотелось, а хотелось что-нибудь эдакое. Тем более авторы задачки намекали на некоторые отличия для русского и английского языка, а так же просили реализовать алгоритм и для восьмеричной системы счисления.

И вот я, начитавшись Александреску, которого мне присоветовал Леха alex36 (Леха, если ты это читаешь, спасибо тебе, книжка - пальчики оближешь! =)), решил изъваять алгоритм полностью на сиплюсплюснутых шаблонах. Эдакое мета-программирование для извращенцев. И таки изваял :) Кусочек кода для примера:
template<class L, int B>
struct num1_999999 : public concat
<
    apply_op
    <
        op_div< power<B, 3>::value >,
        concat
        <
            num1_999<L, typename L::Female, B>,
            str_thousand<L, B>
        >
    >,
    apply_op
    <
        op_mod< power<B, 3>::value >,
        num1_999<L, L, B>
    >
>
{ };


Вот так я числа от 1 до 999999 конвертирую. Через другие конвертеры меньших диапазонов. Причем шаблон иммет два параметра - L и B. L задает язык (в самом низу через этот тип добываются строки), а B - это основание системы счисления. Просто и гениально.

Дальше - больше. Решив довести до предела уровень извращенности кода я написал всю программу так, что в ней нет ни одного явного цикла или условного оператора. Вообще. Есть только неявные вызовы STL-ных алгоритмов в самом конце преобразования.

И вот теперь я второй день уже от себя прусь )) Правда, надо признаться, GCC 4.4 моей гениальности не оценил и код мой компилять отказался. Но в GCC 4.6 все прекрасно компиляется и замечательно работает. Буду вечером еще допиливать код, есть кое-какие интересные идеи ))

upd. а gcc4.4 я таки победил - хватило одного дополнительного тайпдефа. Очень похоже на баг компилятора :) Тем паче что в gcc4.6 он поправлен
Tags: программирование, я
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 1 comment