2016-05-31 15 views
0

私は多くのクラスを持って、という名前の同じクラスから派生B1B2 ...。GET int型Idは、クラス名とそのオブジェクトを使用して呼び出さ

私は、クラスごとにユニークなint型を返すと

getId<Bi>() == get_id(new Bi()) .... for every i (1) 
getId<Bi>() != getId<Bj>()  .... when i!=j  (2) 

、言い換えれば

get_id(new B1()) , get_id(new B2()) .... 

と一致していることなりき

getId<B1>() , getId<B2>() , ... 

関数を作成したいですB1 B2は単なる表記法であり、実生活では整数のない長い名前です。両方の機能を実装する方法

要件
1.私はそれらの多くがあるので、すべてのBi.h(B1をB2 ...クラス)を編集する必要はありません。
2.それは面倒であるため、各クラスの割り当て整数を手動で、許可されていません。
3.それは遅いので型IDまたはdynamic_castをは、使用することはできません(私が試してみました。)
4.テンプレートは
5.非決定性okです生成された整数が低い場合(ボーナス)
6. okです値(例:B1 = 1、B2 = 2 ...)は良いでしょう。

結果(整数)は、ハッシュ関数のために使用されます。

私は(2)(1)&検索が、両方を満たす任意の解決策を見つけることがあります。
は例えば、Efficient way to generate id unique to class?は十分に有用ではありません。

+1

http://en.cppreference.com/w/cpp/types/is_sameをお探しですか? –

+0

いいえ、私は、同じ型チェックではなく、ハッシュ関数に整数を使用します。これを指摘するために質問を編集します。 – javaLover

+0

リンクされたソリューションの問題点は何ですか? – user975989

答えて

0

それはあなたが、これが仕事をしたいか全く明らかではないが、以下のすべての要件を満たし:

#include <tuple> 

struct A {}; 

struct B0 : A {}; 
struct B1 : A {}; 
struct B2 : A {}; 
struct B3 : A {}; 

void get_id(...) {} 

// Just register your types here: 
using types = std::tuple<B0, B1, B2, B3>; 

template <int N> 
void getId() { 
    using T = typename std::tuple_element<N, types>::type; 
    get_id(new T()); // This is leaking memory since there is no delete anywhere 
} 

int main() { 
    getId<0>(); // equivalent to get_id(new B0()); 
    getId<1>(); // equivalent to get_id(new B1()); 
    getId<2>(); // equivalent to get_id(new B2()); 
    getId<3>(); // equivalent to get_id(new B3()); 
} 

あなたはインデックスが指定されたタイプthere are ways of doing that何のためにあるのかを知りたい場合。

+0

これは有望そうです! getId ()も呼び出すことができますか? – javaLover

+0

登録を省略できるといいですが、少し誤りがあります。 – javaLover

1

私の答えはあなたがリンクしている他のスレッドで既に提供されていると思っていたので、それは十分ではないと言っているので、気の利いたテンプレートのものではありません。しかし、私は、私は要件の一部を曲げていたとしても、あなたのジレンマを回避する方法を持っています。

基本クラスと多数の仮想サブクラスがあります。私はその仮想int get_id()const = 0と仮定します。すでに仮想的な基盤である可能性がある。これはほとんどの人が直ちに行うことですが、これを既存の大規模なシステムに追加しており、これらのIDをすべて手動で割り当てることはできません。

私たちがコンピュータを持っていれば、あまりにも面倒です...ああ待ってください。

grep ":public class A"のようなヘッダーを検索することですべてのクラス名を取得できます。また、ヘッダーからそれらを簡単に取得できるようにあまりにも広がっていて、コンパイラのエラーメッセージをgrepしてそれらのクラス名をすべて取得します。出力をファイルにダンプします。さて、その出力からそれぞれの行を読み取るために迅速かつ汚いPythonスクリプトを書き、あなたはgrepの中でそれを行うか、スクリプトをか書くことができますので、私は再とクラス名を引き出すの詳細を省略し

print "int {}::get_id() const {{ return {}; }}".format(classname, linenumber) 

書きます短いC++ヘルパー。ポイントは、これを新しいcppファイルに出力することができます(右のインクルードを含む)、各クラスにidを自動的に割り当てました。

idを新しいクラスに割り当てることはありませんが、少なくともget_idをそのままにしておくと、今のところ退屈ではありません。

+0

+1これは非常にクレイジーな解決策ですが、私はこのように考えた唯一の人ではないことを嬉しく思っています。私はそれを徹底的に調べます。 – javaLover

関連する問題