SORU
21 Ocak 2010, PERŞEMBE


Derleme zamanı dize karma

C 11 Yeni Dize hazır bilgi kullanarak bir dize karma hesaplamak için mümkün olabileceğini derleme zamanında birkaç farklı yerde okudum. Ancak, kimse çıkıp mümkün olacağını ya da bunu nasıl demeye hazır gibi görünüyor.

  • Bu mümkün mü?
  • Operatör neye benzerdi?

Bu gibi durumlarda kullanmak özellikle ilgimi çekti.

void foo( const std::string& value )
{
   switch( std::hash(value) )
   {
      case "one"_hash: one(); break;
      case "two"_hash: two(); break;
      /*many more cases*/
      default: other(); break;
   }
}

Not: derleme karma işlevi tam olarak yazdığım gibi bakmak zorunda değil. Nihai çözüm nasıl olacağını tahmin etmek için elimden geleni yaptım, ama meta_hash<"string"_meta>::value da uygun bir çözüm olabilir.

CEVAP
23 Mart 2012, Cuma


Bu biraz geç, ama constexpr kullanımı ile derleme CRC32 fonksiyonu uygulamada başarılı oldum. Bu sorunu yazma zamanda, sadece GCC ve MSVC ne de Intel derleyici ile çalışır.

Burada kod parçacığı:

// CRC32 Table (zlib polynomial)
static constexpr uint32_t crc_table[256] = {
    0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
    0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
    0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
...
};
template<size_t idx>
constexpr uint32_t crc32(const char * str)
{
    return (crc32<idx-1>(str) >> 8) ^ crc_table[(crc32<idx-1>(str) ^ str[idx]) & 0x000000FF];
}

// This is the stop-recursion function
template<>
constexpr uint32_t crc32<size_t(-1)>(const char * str)
{
    return 0xFFFFFFFF;
}

// This doesn't take into account the nul char
#define COMPILE_TIME_CRC32_STR(x) (crc32<sizeof(x) - 2>(x) ^ 0xFFFFFFFF)

enum TestEnum
{
    CrcVal01 = COMPILE_TIME_CRC32_STR("stack-overflow"),
};

CrcVal01 0x335CC04A eşittir

Bu size yardımcı olacağını umuyoruz!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kyler Briskey

    Kyler Briske

    20 ŞUBAT 2011
  • Noam Erez

    Noam Erez

    3 NİSAN 2012
  • OVERWERK

    OVERWERK

    6 Temmuz 2010