// 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); }
//     );
// }