9

基本的に、C++ で本当にコンパイル時の文字列ハッシュが必要です。テクニックの詳細は気にしません。テンプレート、マクロ、何でもかまいません。これまでに見た他のすべてのハッシュ手法は、実際のハッシュではなく、コンパイル時にハッシュテーブル (256 個の CRC32 ハッシュなど) しか生成できません。

言い換えれば、私はこれを持っている必要があります

printf("%d", SOMEHASH("string"));

(疑似アセンブラで)としてコンパイルされる

push HASHVALUE
push "%d"
call printf

デバッグ ビルドであっても、文字列に対するランタイム操作はありません。私は GCC 4.2 と Visual Studio 2008 を使用していますが、これらのコンパイラで問題なく動作するソリューションが必要です (したがって、C++0x はありません)。

4

6 に答える 6

7

問題は、C++03 では、文字列リテラルに添え字を付けた (つまり、1 文字にアクセスした) 結果が、テンプレート パラメーターとして使用するのに適したコンパイル時の定数ではないことです。

したがって、これを行うことはできません。ハッシュを計算してソース コードに直接挿入するスクリプトを作成することをお勧めします。

printf("%d", SOMEHASH("string"));

に変換されます

printf("%d", 257359823 /*SOMEHASH("string")*/ ));

于 2011-06-23T17:01:29.417 に答える
6

SOMEHASH("") のソースをスキャンし、それを計算されたハッシュに置き換える独自のプリプロセッサを作成します。次に、その出力をコンパイラに渡します。

(I18N にも同様の手法が使用されます。)

于 2011-06-23T17:14:53.687 に答える
3

テンプレートでは、次の構文のみが機能します:SOMEHASH <'s'、't'、'r'、'i'、'n'、'g'>

これを参照してください:http: //arcticinteractive.com/2009/04/18/compile-time-string-hashing-boost-mpl/ または コンパイル時の文字列ハッシュ

于 2011-06-23T17:48:14.397 に答える
1

これには、C++0x のユーザー定義リテラルを待つ必要があります。

于 2011-06-23T17:01:13.170 に答える
0

コードで新しい C++0x 標準を使用することを気にしない場合 (一部の回答には、古い C++03 標準で動作するものへのリンクも含まれています)、これらの質問は StackOverflow で以前に尋ねられました。

文字列のコンパイル時 (プリプロセッサ) ハッシュ
コンパイル時文字列ハッシュ

どちらにも、これを実装する方法を理解するのに役立つ回答が含まれています。

Boost.MPL Compile Time String Hashingの使用方法を示すブログ投稿を次に示します。

于 2011-06-23T17:03:51.493 に答える
-2

それは不可能です。C++0x にはあるかもしれませんが、C++03 にはありません。

于 2011-06-23T17:00:15.863 に答える