The IntegralConstant concept represents compile-time integral values.
The IntegralConstant concept represents objects that hold a constexpr value of an integral type. In other words, it describes the essential functionality provided by std::integral_constant. An IntegralConstant is also just a special kind of Constant whose inner value is of an integral type.
The requirements for being an IntegralConstant are quite simple. First, an IntegralConstant C must be a Constant such that Tag::value_type is an integral type, where Tag is the tag of C.
Secondly, C must have a nested static constexpr member named value, such that the following code is valid:
Because of the requirement that Tag::value_type be an integral type, it follows that C::value must be an integral value.
Finally, it is necessary to specialize the IntegralConstant template in the boost::hana namespace to tell Hana that a type is a model of IntegralConstant:
Constant (free implementation of value)value function required to be a Constant can be implemented as follows for IntegralConstants: to function must still be provided explicitly for the model of Constant to be complete.