Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/types/decay"

From cppreference.com
< cpp‎ | types
m (indentation)
m (a bit cleaner, clearer)
Line 52: Line 52:
 
template <typename T, typename U>
 
template <typename T, typename U>
 
struct decay_equiv :  
 
struct decay_equiv :  
     std::integral_constant<
+
     std::is_same<U, typename std::decay<T>::type>::value>  
        bool, std::is_same<U, typename std::decay<T>::type>::value
+
{};
    > {};
+
  
 
int main()
 
int main()

Revision as of 22:04, 7 September 2013

 
 
Utilities library
General utilities
Relational operators (deprecated in C++20)
 
 
Defined in header <type_traits>
template< class T >
struct decay;
(since C++11)

Applies lvalue-to-rvalue, array-to-pointer, and function-to-pointer implicit conversions to the type T, removes cv-qualifiers, and defines the resulting type as the member typedef type. This is the type conversion applied to all function arguments when passed by value.

Contents

Member types

Name Definition
type the result of applying the decay type conversions to T

Helper types

template< class T >
using decay_t = typename decay<T>::type;
(since C++14)

Possible implementation

template< class T >
struct decay {
    typedef typename std::remove_reference<T>::type U;
    typedef typename std::conditional< 
        std::is_array<U>::value,
        typename std::remove_extent<U>::type*,
        typename std::conditional< 
            std::is_function<U>::value,
            typename std::add_pointer<U>::type,
            typename std::remove_cv<U>::type
        >::type
    >::type type;
};

Example

#include <iostream>
#include <type_traits>
 
template <typename T, typename U>
struct decay_equiv : 
    std::is_same<U, typename std::decay<T>::type>::value> 
{};
 
int main()
{
    std::cout << std::boolalpha << decay_equiv<int[], int*>::value;
}

Output:

true

See also

implicit conversion array-to-pointer, function-to-pointer, rvalue-to-lvalue conversions