将全局 constexpr class 作为静态 constexpr 移动到 class
Move global constexpr class into class as static constexpr
我有一些全局 constexpr
Mask
,我想将其作为 Mask
class 的一部分作为 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
s:
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;
}
我有一些全局 constexpr
Mask
,我想将其作为 Mask
class 的一部分作为 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
s:
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;
}