Reputation: 6120
I have some global constexpr
Mask
s that I would like to make a part of my Mask
class as a static constexpr
to reduce globals in main.cpp
Currently this works:
main.cpp has:
constexpr Mask cg_completeMask(0xffffffffffffffffull, 0x1ffff);
Mask.hpp has (reduced for 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)
{}
};
What I tried to move the global Mask
s from main.cpp:
Mask.hpp has:
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 has:
constexpr Mask Mask::completeMask(0xffffffffffffffffull, 0x1ffff);
What I tried produces these errors:
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;
^
Upvotes: 3
Views: 162
Reputation: 69922
Best I could get was this, which ought to do what you want - but does unfortunately expose your constants in the interface. This is unavoidable I'm afraid.
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);
}
example of use:
auto main() -> int
{
auto m1 = Mask::complete();
auto m2 = Mask::partial();
return 0;
}
Upvotes: 1