- ベストアンサー
シリアルナンバーのチェック方法と重複防止について
- シリアルナンバーのチェック方法と重複防止について知りたいです。
- 継承先のクラス毎にシリアルナンバーを割り当てたいが、重複を防ぐ方法がわかりません。
- コンパイル時にチェックできるか、重複を防ぐ手段について教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#include <iostream> using namespace std; template<typename T> struct ClassToSerial{}; template<int VAL> struct SerialToClass{}; #define UNIQUE_SERIAL(CLASS, SERIAL) \ class CLASS; \ template<> struct ClassToSerial<CLASS> \ { enum { value = SERIAL }; }; \ template<> struct SerialToClass<SERIAL> \ { typedef CLASS type; }; \ #define GET_SERIAL(CLASS) ClassToSerial<CLASS>::value class base { public: int serial; }; UNIQUE_SERIAL( A , 1 ); class A : public base { public: A() { serial = GET_SERIAL(A); } }; //UNIQUE_SERIAL( B , 1 ); // error UNIQUE_SERIAL( B , 2 ); class B : public base { public: B() { serial = GET_SERIAL(B); } }; void main(void) { A a; B b; cout << a.serial << endl; cout << b.serial << endl; } こんな感じにすると、とりあえず重複を防ぐだけなら可能です。 コンパイル時にチェックする方式だと、 template<int VAL> class XXXX{}; というクラスを作った時に、 template<> clas XXXX<1> {...}; template<> clas XXXX<2> {...}; のような特殊化クラスが複数作れないことを利用する方向でなんとか出来ないでしょうか。 好きなように割り当てたい+そもそも重複しない、というのは良くわかりませんが、ユニークなシリアルを自動生成するだけなら、__FILE__ , __LINE__ マクロからハッシュを自動生成、みたいな感じで何とかできるかもしれません。
その他の回答 (1)
- magicalpass
- ベストアンサー率58% (378/648)
コンストラクタで自動生成するとかなら、ユニークシリアルナンバー生成用の処理でも呼びだして対応することは可能ですが、「好きなように割り当てたい」という時点で自動生成はありえないのかと思います。重複チェックしたところで代替のシリアルナンバーをどうするのかって話にもなります。 コンパイラでチェックするなら、クラス名をA,Bではなくhoge5とかhoge2のようにシリアルナンバーを使った名前にしたら、クラス名の重複で弾いてくれるような気はしますが……
お礼
回答ありがとうございます。 >、「好きなように割り当てたい」という時点で自動生成はありえないのかと思います。重複チェックしたところで代替のシリアルナンバーをどうするのかって話にもなります。 はい、その通りです。 代替のナンバーについては、実はこの後シリアルナンバー順にソートした配列を作ろうと考えていました。 ですので代替のナンバーを作るような処理をしてソート順が狂っても困るので、エラーを出して教えてくれるのが一番助かるかな、と思っています。 クラス名で判断するのは面白い発想ですね。 まー出来ればクラス名に制限はかけたくないので、今回はちょっと使わない方向で考えようと思います。
お礼
希望通りの動作が出来ました、ありがとうございます。 実は偶然にもテンプレートの本を読み進めている所だったので、興味深いコードでした。 まだ理解が十分ではないのですが、これはNo.1氏のクラス名の重複に近い考え方ですよね。 >好きなように割り当てたい+そもそも重複しない、というのは良くわかりませんが 説明不足で申し訳ありません。 実はシリアルナンバーは配列のソートに使う予定でして、ソート順を変えたい時には自動生成ですといろいろ不便になりそう、という理由がありました。