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

    +14

    1. 1
    2. 2
    3. 3
    4. 4
    template<typename T>
    constexpr size_t printed_sizeof() {
        return log10(sizeof(T)) + 1;
    }

    Осваиваем новые стандарты.

    Запостил: roman-kashitsyn, 19 Марта 2013

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

    • А разве log10 заведётся внутри constexpr?
      Ответить
      • http://ideone.com/a8Pqu6
        Ответить
        • Вах. Шаманство 90-го уровня. Только тогда уж лучше return ceil(log10(sizeof(T))), если я правильно понимаю идею.
          Ответить
          • а я вообще не понял идею
            может, хотелось "сколько символов максимум займет вот этот вот тип?"
            Ответить
            • Сколько символов займет размер этого типа.

              Но хз зачем это может понадобиться. Размеры типов не так уж часто выводят.
              Ответить
              • немного более обезопасенный printf/scanf?
                зы. до меня дошло что ты написал - действительно в ОП получается размер этого типа, тем более неясно
                табличный вывод с отступами?
                Ответить
                • В исходном варианте было как-то так: [code language=c++] friend Buffer & operator << ( buffer &Buffer, uint16_t num ) throw (BufferException) {
                  char buf[ 6 ];
                  snprintf( buf, sizeof( buf ), "%u", num );
                  buffer << buf;
                  return buffer;
                  }

                  friend buffer & operator << ( Buffer &buffer, uint64_t num ) throw (BufferException)
                  {
                  char buf[ 21 ];
                  snprintf( buf, sizeof( buf ), "%"PRIu64, num );
                  buffer << buf;
                  return buffer;
                  }[/code]
                  что в общем-то достойно отдельного г-поста. Ну я и предложил ребятам обобщённый вариант.
                  Ответить
            • std::numeric_limits<T>::digits10 как бы более полезно.
              Ответить
              • template<typename T>
                constexpr size_t digits10() {
                    return ceil(log10(2) * CHAR_BIT * sizeof(T));
                }
                P.S. Хотя мой код для знаковых и флоатов выдаст неправильный ответ ;(

                P.P.S. Для знаковых надо что-то типа log10(2)*(CHAR_BIT*sizeof(T)-1) + 1. Минус 1 бит, плюс одно знакоместо.
                Ответить
          • Не ceil, а именно floor + 1, потому что и у 999, и у 1000 ceil(log10) будет одинаковый, а длина разная.
            А за numeric_limits спасибо.
            Ответить
      • А почему нет? В constexpr даже свои классы с конструкторами можно запихать, если выполнить несколько требований.
        Ответить
    • Но зачем?
      Ответить
      • Как это зачем?
        Жиденький понос, разве не для этого был создан этот сайт?
        Ответить
    • Знакомо. http://ideone.com/RAH74q
      Ответить

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