hash w czasie kompilacji dla (const char *)

0

Witam,

Mam taki kawałek pseudo-kodu:

void foo()
{
  MyCounter mc;
 
  for(i=0; i < n; i++)
  {
     //..
     mc.inc(CHARPTR_HASH("io_cnt"));
  }

  std::cout << "total: " << mc.get(CHARPTR_HASH("io_cnt")) << endl;
}

Obecnie klasę MyCounter mam opartą na std::map<string, int> i wymaga to tworzenia std::string przy każdym wywołaniu tej klasy. A użycie static std::string za bardzo komplikuje kod.

Problem:
Jak zdefiniować CHARPTR_HASH tak, aby w czasie kompilacji makro to (szablon, whatever) zamieniało podany łańcuch na int-a.
Oczywiście nie interesuje mnie użycie std::string, chyba że nie byłoby tworzone wielokrotnie w pętli for.

0
  auto hash=CHARPTR_HASH("io_cnt");
  for(i=0; i < n; ++i)
  {
     //..
     mc.inc(hash);
2

moze to co w linku pomoze?

c++11
http://dev.krzaq.cc/switch-on-strings-with-c11

1

Jeżeli ograniczysz się do 8 znaków to oczywiście nie będzie wymagane hashowanie - ciąg znaków zamienisz sobie na uint64_t.

Chociaż nie rozumiem takiego podejścia - typowania za pomocą stringów. To już lepiej w tym wypadku będzie zrobić zwykłe #define IO_CNT 1.

0

Zastanów się czy koniecznie potrzebujesz zamiany tego stringa na inną wartość w czasie kompilacji. Prawdopodobnie możesz uzyskać to samo używając czegoś jaśniejszego i mniej niepewnego, np. enuma, albo nawet define'a. Dzięki temu będziesz też mógł (przy sekwencyjnych wartościach) użyć tablicy zamiast mapy (znajdowanie w O(1) zamiast O(log(n))), zamiast hashować string co iterację.

1 użytkowników online, w tym zalogowanych: 0, gości: 1