将全局constexpr类作为静态constexpr移动到类中

Move global constexpr class into class as static constexpr

本文关键字:constexpr 移动 静态 全局      更新时间:2023-10-16

我有一些全局constexpr Mask,我想将其作为Mask类的一部分作为static constexpr,以减少main.cpp 中的全局

目前有效

  • main.cpp具有

    constexpr Mask cg_completeMask(0xffffffffffffffffull, 0x1ffff);
    
  • Mask.hpp已(SO降低)

    class Mask {
        unsigned long long m_64;
        unsigned int       m_32;
    public:        
        constexpr Mask(const unsigned long long ac_64, const unsigned int ac_32) :
            m_64(ac_64),
            m_32(ac_32)
        {}
    };
    

我试图从main.cpp移动全局Mask的内容

  • Mask.hp:

    class Mask {
        unsigned long long m_64;
        unsigned int       m_32;
    public:        
        static constexpr Mask completeMask;
        constexpr Mask(const unsigned long long ac_64, const unsigned int ac_32) :
            m_64(ac_64),
            m_32(ac_32)
        {}
    };
    
  • Mask.cpp具有

    constexpr Mask Mask::completeMask(0xffffffffffffffffull, 0x1ffff);
    

我尝试的操作会产生这些错误

In file included from main.cpp:3:0:
Mask.hpp:12:27: error: constexpr static data member 'completeMask' must have an initializer
     static constexpr Mask completeMask;
                           ^
In file included from Mask.cpp:1:0:
Mask.hpp:12:27: error: constexpr static data member 'completeMask' must have an initializer
     static constexpr Mask completeMask;
                           ^

我能得到的最好的结果是这样,它应该做你想做的事情,但不幸的是,它在接口中公开了你的常量。恐怕这是不可避免的。

*口罩.hpp

class Mask {
    unsigned long long m_64;
    unsigned int       m_32;

    // private constructor
    constexpr Mask(const unsigned long long ac_64, const unsigned int ac_32) :
    m_64(ac_64),
    m_32(ac_32)
    {}
public:
    // public declarations
    inline static constexpr Mask complete();
    inline static constexpr Mask partial();
};
// inline definitions
constexpr Mask Mask::complete()
{
    return Mask(0xffffffffffffffffull, 0x1ffff);
}
constexpr Mask Mask::partial()
{
    return Mask(0xf0f0f0f0f0f0f0f0ull, 0x1ffff);
}

使用示例:

auto main() -> int
{
    auto m1 = Mask::complete();
    auto m2 = Mask::partial();
    return 0;
}