@@ -251,14 +251,9 @@ class any {
251251 any(T&& val, typename std::enable_if<std::is_assignable<managed<void>,T>::value>::type* = 0) noexcept
252252 : tag(Tag::Pointer), p(std::move(val)) {}
253253
254− // Explicit void* to raw pointer value
255− template <typename T>
256− any(const T& val, typename std::enable_if<std::is_same<T,void*>::value>::type* = 0) noexcept
257− : tag(Tag::RawPointer), v(val) {}
258−
254+ any(void * val) noexcept : tag(Tag::RawPointer), v(val) {}
259255 any(nullptr_t) noexcept : tag(Tag::RawPointer), v(nullptr) {}
260256
261−
262257#if !defined(USE_GC)
263258 private:
264259 auto destruct() const noexcept -> void {
@@ -337,6 +332,17 @@ class any {
337332 operator const array&() const;
338333 operator const record&() const;
339334
335+ operator void *() const {
336+ return extractPointer(IF_DEBUG(Tag::RawPointer));
337+ }
338+
339+ template <typename T,
340+ typename = typename std::enable_if<std::is_pointer<T>::value &&
341+ std::is_class<typename std::remove_pointer<T>::type>::value>::type>
342+ operator T() const {
343+ return static_cast<T>(extractPointer(IF_DEBUG(Tag::RawPointer)));
344+ }
345+
340346 auto operator[](const size_t) const -> const any&;
341347 auto at(const char *) const -> const any&;
342348 auto size() const -> size_t;