gpt4 book ai didi

c++ - 如何在 Mixin 类中按类型返回组件?

转载 作者:太空宇宙 更新时间:2023-11-04 16:13:17 24 4
gpt4 key购买 nike

我一直在尝试使用可变模板来实现一个使用 Mixins 的 GameObject 类(结合 CRTP 以实现静态多态性)。我的一切正常,但 GameObjectgetComponent() 方法需要类型和索引,这很麻烦。是否可以重写 getComponent(),使其只需要我想要的组件的类型或索引?

下面是构成 Mixins 的组件的代码:

class ComponentBase {
public:
virtual void update () = 0;
};

template <class T>
class Component : public ComponentBase {
public:
virtual void update () {
static_cast<T*>(this)->update();
}
};

class TransformComponent : public Component<TransformComponent> {
public:
void update () {
// ...
}
// ...
protected:
int _x, _y;
};

class ColliderComponent : public Component<ColliderComponent> {
public:
void update () {
// ...
}
// ...
protected:
bool _collided;
};

然后是 GameObject Mixin 类:

template <class ... Mixins>
class GameObject : private Mixins...
{
public:
GameObject (const Mixins&... mixins) : Mixins(mixins)..., _components{&mixins...} {}
GameObject (Mixins&&... mixins) : Mixins(std::forward<Mixins>(mixins))..., _components{&mixins...} {}

constexpr size_t getNumComponents () const { return _numComponents; };

template <typename T, int index>
constexpr T* getComponent () const {
static_assert(index < _numComponents, "getComponent: index out of range");
return static_cast<T*>(_components[index]);
}

void update () {
for (size_t i = 0; i < getNumComponents(); ++i) {
_components[i]->update();
}
}

protected:
static const size_t _numComponents = sizeof...(Mixins);
ComponentBase* _components[sizeof...(Mixins)];
};

我想像这样使用自动返回值:

template <int index>
constexpr auto getComponent() const -> decltype(_components[index]) {
return _components[index];
}

但是 decltype 无法计算方法声明中的表达式。

我还尝试对 getComponent() 使用模板递归来接收组件的类型,但是您不能在非专门化的模板化类中专门化类方法。即:

template <typename T>
constexpr T* getComponent () const {
// If T equals the type of _components[index], then return, else
// call getComponent<T, index - 1>().
}

我对使用 TMP 还很陌生,因此非常感谢您的帮助。

最佳答案

首先,我认为这里出了点问题:

 GameObject (const Mixins&... mixins) : Mixins(mixins)..., _components{&mixins...} {}
GameObject (Mixins&&... mixins) : Mixins(std::forward<Mixins>(mixins))..., _components{&mixins...} {}

看起来您希望将给定对象作为私有(private)基类存储在混合对象中,但您正在为您的 _components 成员获取指向原始对象的指针。如果移动了原始对象,您甚至会将指针指向最有可能移出的对象。

正因为如此,我并不是 100% 清楚你真正想要什么,但这里有一个基于 std::tuple 而不是多重私有(private)继承的解决方案:

http://coliru.stacked-crooked.com/a/178be711a9a62f2b

如您所见,我们不需要公共(public)基类。 mixin 支持所有提供 update 方法的类型。当然,如果您在其他地方需要它,您可以修改它以要求基类。

关于c++ - 如何在 Mixin 类中按类型返回组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25670185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com