0

たとえば、基本クラスとAそのサブクラスなどがあります。また、そのサブクラスを持つこともできます。構造はルートを持つツリーです。また、ツリー内の各クラスには、それ自体を識別するために異なる整数が割り当てられます。整数 ID の値と順序に制限はありません。クラスごとに異なることを確認してください。BCBCA

私の質問は、手動の割り当てはエラーが発生しやすいため、同様のテンプレート手法を使用してスマートに (または自動的に) 行う方法です。ID を取得する方法はどれでもかまいません。

class A
{
public:
    static const id = ...;
};

また

template<class A>
struct Id
{
    enum { value = ... };
};
4

2 に答える 2

1

最も簡単な方法は単なる関数です

int nextId() {
    static int rval = 1;
    return rval++;
}

class A { public: static const id = nextId();  };
class B { public: static const id = nextId();  };
class C { public: static const id = nextId();  };

プログラムの開始時に動的初期化で ID を使用する必要がない限り、これは機能します。

編集: それが十分でない場合、次のステップは、テンプレート内の静的変数で同じことを行うことです。これはコンパイル単位全体で機能しますが、依然として動的な初期化時間です。

template <typename DummyT = void>
struct CommonCounter
{
    public:
        static int nextId() {
            static int rval = 1;
            return rval ++;
        }
};

template <typename T>
struct IdFor
{
    static int value()
    {
        static int rval = CommonCounter<>::nextId();
        return rval;
    }
};

class A { public: static const id = IdFor<A>::get(); };
于 2013-09-16T01:33:27.413 に答える