2016-09-23 6 views
0

私はtypeid(ClassName).name()を使用して、幅広い種類のクラスの名前を取得します。しかし、その長さを固定(例えば8文字)にする必要があります。多くの場合、クラスは文字列を長くする名前空間にあり、最初の10文字を取得するだけでは機能しません。修正サイズのクラス名文字列を取得する方法

文字列を固定サイズの文字列にコード化/デコードする良い方法を知っている人はいますか?私はマップにアクセスできない別のマシンに文字列を送るつもりなので、実際にはhash_codeを名前にマップするテーブルを保持することはできません。一般的に

template <typename ClassType> char* get_name(){ 
     return typeid(ClassType).name(); // ?? 
} 
+0

圧縮アルゴリズムを見つける必要があるようです。それが可能かどうかわからない。 – alain

+2

これは[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)とよく似ています。 – molbdnilo

+0

@molbdniloもしあなたがtypeidを使う以外の方法を知っていれば、私は知っていて嬉しいです。 –

答えて

0

、それが固定されたドメインに機能マッピング任意の長さの文字列を構築することはできません。これはpigeonhole principleに違反しています。

次の提案がかなり複雑に思えるが、あなたの問題へのより大きな文脈の欠如与えられ、ここに行く...

は、あなたがそう

として、すべてのあなたの名前を実行するを通じてクラスを構築すると仮定

これは、シードを取るctorと、名前文字列を取って8文字のキー文字列を返すことの2つのメンバーを持っています。コードでは、このオブジェクトをいくつかの固定された任意のシードで初期化します。

内部的には、クラスオブジェクトは、適用された個別の名前ごとに、マップされたキーであるunordered_mapのマッピングを保持する必要があります。最初は明らかに、この内部のunordered_mapは空になります。

クラスオブジェクトは、コンストラクタのseedによって疑似ランダムに選択されたuniversal hash functionを使用する必要があります。ユニバーサルハッシュ関数を作成する1つの方法については、this questionへの回答を参照してください。

オペレータが呼び出されると、その名前が内部にあるかどうかを確認する必要がありますunordered_map。そうであれば、見つかったキーを返します。それ以外の場合は、まずハッシュ関数を使用してキーを計算し、内部のunordered_mapに配置します。ただし、新しいキーを生成する場合は、既存のキーと衝突するかどうかを確認し、存在する場合は例外をスローします。各個別の名前がtypeidを呼び出すコード内の場所に対応しているので

現実的に言えば、明確な名前の数は、Nが高々、1000年代にあるべきと言います。 mを8文字(2 )の可能な範囲に設定します。

衝突の確率は、小さなであるべき、〜N /(2M)あります。したがって、ほとんどの場合、衝突はなく、例外もスローされません。しかし、投げられた場合は、種を変え、プログラムを再構築してください。あなたがそれをしなければならないと予想される回数(最初の時間の後)は0に近いです。

関連する問題