#include <memory>

namespace language_ext
{

struct new_unique_seed { };

template <class T>
inline std::unique_ptr<T> operator *(new_unique_seed, T *p)
{
   return std::unique_ptr<T>(p);
}

struct new_unique_array_seed { };

template <class T>
inline std::unique_ptr<T[]> operator *(new_unique_array_seed, T *p)
{
   return std::unique_ptr<T[]>(p);
}

}

#define new_unique ::language_ext::new_unique_seed() * new
#define new_unique_array ::language_ext::new_unique_array_seed() * new

#include <iostream>

int main()
{
   auto p = new_unique int;
   auto a = new_unique_array int[5];

   std::cout << typeid(p).name() << std::endl;
   std::cout << typeid(a).name() << std::endl;

   return 0;
}