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 和 bitset。

问:如何强制此方法只接受基类型 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
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 回答
0

你说的对。任何导数都可以通过。C++ 语言没有此类限制的功能。您只能使该方法受保护/私有,以缩小可能调用地点的范围。在较小的范围内,您有更好的机会控制呼叫。

于 2012-06-24T23:00:02.073 回答