我正在编写一个实体组件系统作为 C++17 的练习。我想让每个组件类型(表示为一个结构)与一个唯一标识符相关联,该标识符可用作组件注册表中位集向量的索引,例如。这可以使用模板化的 struct ComponentType
。ComponentType<Tag>::type
但是,每次我想获得价值时都感觉很冗长。我更喜欢使用类似component_type_t<Tag>
. 但是,使用模板化别名和如下实现会失败,尽管它会编译,但使用会产生以下输出。有没有更好的方法来解决这个问题?
0
1
2
0
0
0
代码:
#include <iostream>
namespace ECS {
struct ComponentTraits {
using component_type = unsigned int;
protected:
static component_type types;
};
using component_type = ComponentTraits::component_type;
component_type ComponentTraits::types = 0;
template<typename Component>
struct ComponentType : public ComponentTraits {
static const component_type type;
};
template<typename Component>
const component_type ComponentType<Component>::type = types++;
template<typename Component>
const component_type component_type_t = ComponentType<Component>::type;
//Components
struct Tag {};
struct Transform {};
struct Mesh {};
// and so on...
////Won't compile
//template<typename Component>
//using component_type_t = ComponentType<Component>::type;
};
int main() {
using namespace ECS;
std::cout << ComponentType<Tag>::type << std::endl;
std::cout << ComponentType<Transform>::type << std::endl;
std::cout << ComponentType<Mesh>::type << std::endl;
std::cout << component_type_t<Tag> << std::endl;
std::cout << component_type_t<Transform> << std::endl;
std::cout << component_type_t<Mesh> << std::endl;
return 0;
}