1. namespace mystd {
    2. template <typename T>
    3. struct decay {
    4. private:
    5. typedef typename std::remove_reference<T>::type U;
    6. public:
    7. typedef typename std::conditional<
    8. std::is_array<U>::value, typename std::remove_extent<U>::type *,
    9. typename std::conditional<
    10. std::is_function<U>::value, typename std::add_pointer<U>::type,
    11. typename std::remove_cv<U>::type>::type>::type type;
    12. };
    13. template <typename T>
    14. using decay_t = typename decay<T>::type;
    15. } // namespace mystd
    16. // test
    17. int main(int argc, char **argv) {
    18. mystd::decay_t<int> a = 1000;
    19. std::cout << std::is_same<int, mystd::decay_t<int>>::value << std::endl;
    20. return 0;
    21. }