2011-08-22 15 views
9

コンパイル時にクラスの派生型に基づいてクラスのハッシュを生成します。今日、私はそれが好きで生成:コンパイル時にC++タイプのID

template<class Type> 
class TypeBase 
{ 
public: 
    static const unsigned s_kID; 
}; 

template<class Type> 
const unsigned TypeBase<Type>::s_kID = hash(typeid(Type)); 

が、これが生成する(かなり不必要に)実行時の初期化コード(ハッシュ(..)関数は、STDに基づいて、単純なハッシュを行います::(名:: TYPE_INFO))

アイデア?

+0

ハッシュの衝突が発生する危険性はありませんか、それとも問題ではないでしょうか? –

+0

@アンドレアス:ハッシュを作成するとき、ハッシュエントリを持つマップもあります。したがって、衝突があるかどうかを確認できます。それに加えて、クラス数は20かもしれないので、私もそれで安全ですね。 – Robert

+0

'id = ++ someGlobalCounter'のようなことはできませんか? –

答えて

3

プロセスの起動時に発生するすべてのことと、既存のコードがどれほどシンプルでエレガントであるかを考えれば、巨大な型をハッシュしないと仮定すると、そのまま既存のソリューションをそのまま残すことができます。

+0

ありがとうございます。早すぎる最適化のケース、ええ? ;) – Robert

+0

確かに。起動時に150マイクロ秒を要していると不満を表明しているユーザーのようなランタイムへの影響がない限り、そのままにしておいてください。その変数のポインタを符号なしにキャストする魔法を実行しようとしないでください。これは移植性がないためです。 – PlasmaHH

+0

@robertはい、それは私のように思えます。 –

関連する問題