Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Constexpr和know how count类_C++_C Preprocessor_Constexpr - Fatal编程技术网

C++ Constexpr和know how count类

C++ Constexpr和know how count类,c++,c-preprocessor,constexpr,C++,C Preprocessor,Constexpr,我正在研究一个实体组件系统,并试图根据从组件类本身派生的类的数量来确定组件类型编号 但是我认为C++中有一些缺失的功能,我想做的都是。 因为组件类的数量应该是某个constexpr整数,我应该使用它来分隔向量、位掩码等。。。 现在,我可以让每个派生类都有一个唯一的类型号,但无法检测作为派生类号的位集的大小 基础: /! //! \类组件库 //! \简短存在仅用于以预处理器方式管理计数器类型 //! 类组件库{ 受保护的: 静态uint32\u t计数器类型;//实际组件编号的计数器 公众: 虚

我正在研究一个实体组件系统,并试图根据从组件类本身派生的类的数量来确定组件类型编号

<>但是我认为C++中有一些缺失的功能,我想做的都是。 因为组件类的数量应该是某个constexpr整数,我应该使用它来分隔向量、位掩码等。。。 现在,我可以让每个派生类都有一个唯一的类型号,但无法检测作为派生类号的位集的大小

基础:

/!
//! \类组件库
//! \简短存在仅用于以预处理器方式管理计数器类型
//!
类组件库{
受保护的:
静态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> {};