0

次の方法を検討してください

static ComponentType & getTypeFor(const type_info &t){
        ComponentType * type = componentTypes[t.hash_code()];

        if(type == NULL)
        {
            type = new ComponentType();
            componentTypes[t.hash_code()] = type;
        }
        return *type;
};

static bitset<BITSIZE> getBit(const type_info &t){
    ComponentType & type = getTypeFor(t);
    return type.getBit();
}

私はこれを次のように呼びます

ComponentManagerType::getBit(typeid(MyComponentClass)); 
// Not an instance, passing class name

ComponentManagerTypeが示唆するように、これは、コンポーネントのみを対象としています。現在の問題は、どのタイプも渡すことができるということです。害はありませんが、非コンポーネントオブジェクトのIDとビットセットが作成されます。

Q:基本タイプComponentのオブジェクトのみを受け入れるようにこのメソッドを強制するにはどうすればよいですか?

直接的な方法はないことを私は知っています。しかし、私はこれに頭を悩ませています。

編集:私自身の解決策を追加しました。コーシャかどうかはわかりません。

4

3 に答える 3

2

直接的な方法はありません。type_info設計上、最小限のインターフェースです。

getBitとして呼び出し可能なテンプレート関数として書き直すことをお勧めしますgetBit<MyComponentClass>()。次に、テンプレートの基本タイプを確認し(たとえば、boost ::is_base_ofを使用します。std:: enable_ifを使用してテンプレート関数宣言で要件を適用することもできます) typeid、基本クラスが正しいことを認識して操作を実行できます。

于 2012-06-24T23:04:03.803 に答える
0

あなたが正しいです。任意の導関数を渡すことができます。C ++言語には、このタイプの制限に対する機能はありません。メソッドをプロテクト/プライベートにして、呼び出しの可能性のある場所の領域を絞り込むことしかできません。スコープが小さいほど、通話を制御できる可能性が高くなります。

于 2012-06-24T23:00:02.073 に答える
0
template<typename component>
static bitset<BITSIZE> getBit(){

    //Check if we are being legal with components and shizzle
    Component * c = (component*)0;

    ComponentType & type = getTypeFor(typeid(component));
    return type.getBit();
}

これは致命的なエラーをスローします。キャストが機能しない場合。それは単にそれがコンポーネントではないことを意味します。

しかし、これがどのように公平になるかはわかりません。

しかし、これはうまくいくようです!

于 2012-06-25T00:10:32.347 に答える