簡體   English   中英

將全局constexpr類作為靜態constexpr移動到類中

[英]Move global constexpr class into class as static constexpr

我有一些全局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.hpp有

     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;
                           ^

我能得到的最好的是,它應該做你想要的 - 但不幸的是在界面中暴露你的常量。 這是不可避免的,我害怕。

* Mask.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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM