+template<typename T>
+struct can_memset
+{
+ static constexpr bool value = std::is_pod<T>::value || std::is_void<T>::value;
+};
+
+template <typename T, typename = typename std::enable_if<!can_memset<T>::value>::type>
+void *memset(T *s, int c, size_t n) = delete;
+
+template<typename T>
+struct can_memcpy
+{
+ static constexpr bool value = std::is_trivially_copyable<T>::value;
+};
+
+template <typename T, typename U,
+ typename = typename std::enable_if<!can_memcpy<T>::value>::type,
+ typename = typename std::enable_if<!can_memcpy<U>::value>::type>
+void *memcpy(T *d, const U *s, size_t n) = delete;
+
+template<typename T>
+struct can_memmove
+{
+ static constexpr bool value = std::is_trivially_copyable<T>::value;
+};
+
+template <typename T, typename U,
+ typename = typename std::enable_if<!can_memmove<T>::value>::type,
+ typename = typename std::enable_if<!can_memmove<U>::value>::type>
+void *memmove(T *d, const U *s, size_t n) = delete;
+