Here\'s a bit of code that might seem like it would work:
#include
#include
enum test { A = 1 };
int main()
{
int max =
The numeric_limits<T>
is a regular class template, it is not connected to the compiler in any special way as to find out about user-defined enum
types. If you look at the <limits>
file, it has the default template definition that returns zeros for everything, and a whole bunch of type-specific specifications for the individual types, returning the right constants.
You can "plug in" your enum
into numeric_limits
by providing a specification of numeric_limits<test>
by yourself. You can copy the one for int
from the <limits>
, and modify it to suit your needs.
From the C++11 draft:
In 18.3.2.1, about numeric_limits
:
Non-arithmetic standard types, such as complex (26.4.2), shall not have specializations.
And an enum is not an arithmetic standard type.
Then, in the non-specialized template:
template<class T> class numeric_limits {
public:
[...]
static constexpr bool is_specialized = false;
static constexpr T max() noexcept { return T(); }
};
That is, the non-specialized max()
function returns the default initialized value for that type, that is 0.
For non-specialized versions of the template, max
returns T()
. You have not written a numeric_limits
specialization for your test
type, so you get the default implementation.
std::numeric_limits
is specialized in the Standard Library "for each arithmetic type, both floating point and integer, including bool
" (§18.3.2.1/2).
Your enumeration test
is not one of these types, so the primary template is used. Its behavior is specified by §18.3.2.3/1: "The default numeric_limits<T>
template shall have all members, but with 0
or false
values."
If you want to know the traits of the underlying type of test
, you can use underlying_type
:
std::numeric_limits<std::underlying_type<test>::type>::max()
Alternatively, you can specialize numeric_limits
for test
and have it return the values you want. This is not a particularly good idea, though.