// RAII type erasure. template<typename T, typename... Args> auto make_unique_void(Args &&... args) { return std::unique_ptr<void, std::default_delete<T>>( new T(std::forward<Args>(args)...) ); } // template<typename T, typename... Args> // auto make_unique_void(Args &&... args) // { // return std::unique_ptr<void, void(*)(void const *)>( // new T(std::forward<Args>(args)...), // [](void const * p) { delete static_cast<T const *>(p); } // ); // }