Implement P0887: The identity metafunction

llvm-svn: 338666
This commit is contained in:
Marshall Clow
2018-08-02 01:56:02 +00:00
parent b9a7b7a84d
commit cf49ccd0e5
2 changed files with 50 additions and 0 deletions

View File

@@ -75,6 +75,10 @@ namespace std
template <class T> struct remove_pointer;
template <class T> struct add_pointer;
template<class T> struct type_identity; // C++20
template<class T>
using type_identity_t = typename type_identity<T>::type; // C++20
// Integral properties:
template <class T> struct is_signed;
template <class T> struct is_unsigned;
@@ -1226,6 +1230,12 @@ template <class _Tp> struct _LIBCPP_TEMPLATE_VIS add_pointer
template <class _Tp> using add_pointer_t = typename add_pointer<_Tp>::type;
#endif
// type_identity
#if _LIBCPP_STD_VER > 17
template<class _Tp> struct type_identity { typedef _Tp type; };
template<class _Tp> using type_identity_t = typename type_identity<_Tp>::type;
#endif
// is_signed
template <class _Tp, bool = is_integral<_Tp>::value>

View File

@@ -0,0 +1,40 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
// type_traits
// type_identity
#include <type_traits>
#include "test_macros.h"
template <class T>
void test_type_identity()
{
static_assert((std::is_same<typename std::type_identity<T>::type, T>::value), "");
static_assert((std::is_same< std::type_identity_t<T>, T>::value), "");
}
int main()
{
test_type_identity<void>();
test_type_identity<int>();
test_type_identity<const volatile int>();
test_type_identity<int*>();
test_type_identity< int[3]>();
test_type_identity<const int[3]>();
test_type_identity<void (*)()>();
test_type_identity<int(int) const>();
test_type_identity<int(int) volatile>();
test_type_identity<int(int) &>();
test_type_identity<int(int) &&>();
}