namespace mystd {
template <typename T>
struct decay {
private:
typedef typename std::remove_reference<T>::type U;
public:
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;
};
template <typename T>
using decay_t = typename decay<T>::type;
} // namespace mystd
// test
int main(int argc, char **argv) {
mystd::decay_t<int> a = 1000;
std::cout << std::is_same<int, mystd::decay_t<int>>::value << std::endl;
return 0;
}