C++ Constexpr和know how count类
我正在研究一个实体组件系统,并试图根据从组件类本身派生的类的数量来确定组件类型编号 <>但是我认为C++中有一些缺失的功能,我想做的都是。 因为组件类的数量应该是某个constexpr整数,我应该使用它来分隔向量、位掩码等。。。 现在,我可以让每个派生类都有一个唯一的类型号,但无法检测作为派生类号的位集的大小 基础:C++ Constexpr和know how count类,c++,c-preprocessor,constexpr,C++,C Preprocessor,Constexpr,我正在研究一个实体组件系统,并试图根据从组件类本身派生的类的数量来确定组件类型编号 但是我认为C++中有一些缺失的功能,我想做的都是。 因为组件类的数量应该是某个constexpr整数,我应该使用它来分隔向量、位掩码等。。。 现在,我可以让每个派生类都有一个唯一的类型号,但无法检测作为派生类号的位集的大小 基础: /! //! \类组件库 //! \简短存在仅用于以预处理器方式管理计数器类型 //! 类组件库{ 受保护的: 静态uint32\u t计数器类型;//实际组件编号的计数器 公众: 虚
/!
//! \类组件库
//! \简短存在仅用于以预处理器方式管理计数器类型
//!
类组件库{
受保护的:
静态uint32\u t计数器类型;//实际组件编号的计数器
公众:
虚拟~ComponentBase(){}
};
}
typedef std::位集T_掩码;
派生:
/!
//! \类组件
//! \组件、库存类型编号和管理器的简要超类
//!
模板
类组件:公共组件库{
公众:
静态常数32_t型;
受保护的:
组件()=默认值;
};
}
模板
const uint32_t Component::Type=++ComponentBase::CounterType;
但是现在我不能使用计数器类型来设置位集大小。
用constexpr试过,但没有成功
如果你有什么想法,我洗耳恭听。
谢谢你
PS:我没有任何C++限制(G+6-2现在)
< P>对不起,但是YO必须决定:std::bitset
需要N
的常量(expr)编号(某物),因此您可以通过
static const uint32_t CounterType = 1; // Counter of actual component number
++ComponentBase::CounterType代码>将不起作用,因为您尝试递增常量变量
我觉得你的设计有点可疑,所以请与我们分享更多的场景信息,以便更清楚地识别问题。 你在C++中不可能要求的是什么。 假设您的基础和衍生工具可通过
header.hpp获得(可传递地包含在中),并且是合法的++
您的项目中有以下文件:
1.cpp
#包括“header.hpp”
第一类{};
类ComponentOne:公共组件{};
2.cpp
#包括“header.hpp”
第二类{};
类ComponentOne:公共组件{};
将cc.exe旋转一次,将1.cpp编译成1.o,将另一个实例将2.cpp编译成2.o,会发生什么情况?说真的,存在注释太多的情况。特别是语言功能…抱歉,删除了代码但忘记了注释!谢谢你回答我的问题,我想你做不到。派生类的数目是不绑定的,并且在编译所有翻译单元时都不可用。听起来像是一个不错的例子,但我想知道C++是否能够解决这个问题,也许是用一些CysExpR来解决更多的上下文。如果你是正确的,C++不会同时查看整个代码,所以这是不可能的。谢谢:)
//!
//! \class Component
//! \brief Superclass for Component, stock Type number and Manager
//!
template < typename Derived >
class Component : public ComponentBase {
public:
static const uint32_t Type;
protected:
Component() = default;
};
}
template < typename Derived >
const uint32_t Component<Derived>::Type = ++ComponentBase::CounterType;
static const uint32_t CounterType = 1; // Counter of actual component number
#include "header.hpp"
class One {};
class ComponentOne : public Component<One> {};
#include "header.hpp"
class Two {};
class ComponentOne : public Component<Two> {};