C++ Type Traits | `<type_traits>` Complete Guide

C++ Type Traits | `<type_traits>` Complete Guide

이 글의 핵심

Practical tour of `<type_traits>` for queries, transformations, and conditional templates.

Basic queries

#include <type_traits>
std::is_integral_v<int>
std::is_floating_point_v<double>
std::is_pointer_v<int*>

Transformations

std::remove_const_t<const int>           // int
std::remove_reference_t<int&>            // int
std::decay_t<int[10]>                  // int*

Relations

std::is_same_v<int, int>
std::is_convertible_v<int, double>
std::is_base_of_v<Base, Derived>

SFINAE patterns

template<typename T>
std::enable_if_t<std::is_integral_v<T>, T>
twice(T value) { return value * 2; }

template<typename T>
std::enable_if_t<std::is_floating_point_v<T>, T>
twice(T value) { return value * 2.0; }

if constexpr branches

template<typename T>
void process(T value) {
    if constexpr (std::is_integral_v<T>) {
        std::cout << "integral\n";
    } else if constexpr (std::is_floating_point_v<T>) {
        std::cout << "floating\n";
    } else {
        std::cout << "other\n";
    }
}

Custom traits with void_t

template<typename T, typename = void>
struct is_container : std::false_type {};

template<typename T>
struct is_container<T, std::void_t<
    typename T::value_type,
    decltype(std::declval<T>().begin()),
    decltype(std::declval<T>().end())
>> : std::true_type {};

template<typename T>
inline constexpr bool is_container_v = is_container<T>::value;

FAQ

Resources: cppreference type_traits, C++ Templates: The Complete Guide, Effective Modern C++.


  • SFINAE
  • enable_if

Keywords

C++, type traits, SFINAE, templates, metaprogramming