home | help
std::integral_constant(3)      C++ Standard Libary     std::integral_constant(3)

NAME
     std::integral_constant - std::integral_constant

Synopsis
	Defined in header <type_traits>
	template< class T, T v >	 (since C++11)
	struct integral_constant;

	std::integral_constant	wraps a static constant of specified type. It is
     the base
	class for the C++ type traits.

	If the program adds specializations for std::integral_constant, the  be-
     havior is
	undefined.

Specializations
	Two typedefs for the common case where T is bool are provided:

	Defined in header <type_traits>
	Name	   Definition
	true_type  std::integral_constant<bool, true>
	false_type std::integral_constant<bool, false>

	Nested types

	Name	   Definition
	value_type T
	type	   std::integral_constant<T, v>

Member constants
	Name		  Value
	constexpr T value v
	[static]	  (public static member constant)

Member functions
	operator value_type returns the wrapped value
			    (public member function)
	operator()	    returns the wrapped value
	(C++14) 	    (public member function)

     std::integral_constant::operator value_type

	constexpr operator value_type() const noexcept;

	Conversion function. Returns the wrapped value.

     std::integral_constant::operator()

	constexpr value_type operator()() const noexcept;  (since C++14)

	Returns  the wrapped value. This function enables std::integral_constant
     to serve as
	a source of compile-time function objects.

Possible implementation
	template<class T, T v>
	struct integral_constant
	{
	    static constexpr T value = v;
	    using value_type = T;
	    using type = integral_constant; // using injected-class-name
	    constexpr operator value_type() const noexcept { return value; }
	    constexpr value_type operator()() const noexcept { return  value;  }
     // since c++14
	};

Notes
		 Feature-test  macro		Value	 Std		    Fea-
     ture
	__cpp_lib_integral_constant_callable 201304L (C++14)  std::integral_con-
     stant::operator()
	__cpp_lib_bool_constant 	     201505L (C++17) std::bool_constant

Example
     // Run this code

      #include <type_traits>

      using two_t = std::integral_constant<int, 2>;
      using four_t = std::integral_constant<int, 4>;

      static_assert(not std::is_same_v<two_t, four_t>);
      static_assert(two_t::value * 2 == four_t::value, "2*2 != 4");
      static_assert(two_t() << 1 == four_t() >> 0, "2*2 != 4");

      enum class E{ e1, e2 };
      using c1 = std::integral_constant<E, E::e1>;
      using c2 = std::integral_constant<E, E::e2>;
      static_assert(c1::value != E::e2);
      static_assert(c1() == E::e1);
      static_assert(std::is_same_v<c2, c2>);

      int main() {}

See also
	integer_sequence implements compile-time sequence of integers
	(C++14) 	 (class template)

http://cppreference.com 	   2024.06.10	       std::integral_constant(3)

home | help