In order to extract information about template types, the STL provides a type traits library, available in the <type_traits> header. All type traits are evaluated at compile time. For example, this function, which returns 1 if the value is zero or above and -1, otherwise, can immediately return 1 for unsigned integers as follows:
template <typename T> auto sign_func(const T& v) -> int { if (std::is_unsigned_v<T>) { return 1; } return v < 0 ? -1 : 1; }
As they are evaluated at compile time, the compiler will generate codes as shown in the following table when invoked with an unsigned and signed integer, respectively:
Used with an unsigned integer... | ...generated function: |
auto unsigned_v = uint32_t{32}; auto sign=sign_func(unsigned_v); ... |