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++.
Related posts
- SFINAE
- enable_if
Keywords
C++, type traits, SFINAE, templates, metaprogramming