#include <cstdlib>
#include <utility>
template <typename T>
struct new_impl
{
typedef T* type;
static T* call() { return new T; }
};
template <typename T>
struct new_impl<T[]>
{
typedef T* type;
static T* call(std::size_t i) { return new T[i]; }
};
template <typename T, std::size_t N>
struct new_impl<T[N]>
{
typedef T* type;
static T* call() { return new T[N]; }
};
template <typename T, typename ...Args>
typename new_impl<T>::type new_(Args&&... args) {
return new_impl<T>::call(std::forward<Args>(args)...);
}
int main()
{
int* t1 = new_<int>();
int* t2 = new_<int[]>(20);
int* t3 = new_<int[20]>();
return 0;
}
I2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDx1dGlsaXR5PgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBuZXdfaW1wbAp7Cgl0eXBlZGVmIFQqIHR5cGU7CgkKCXN0YXRpYyBUKiBjYWxsKCkgeyByZXR1cm4gbmV3IFQ7IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgbmV3X2ltcGw8VFtdPgp7Cgl0eXBlZGVmIFQqIHR5cGU7CgogICAgc3RhdGljIFQqIGNhbGwoc3RkOjpzaXplX3QgaSkgeyByZXR1cm4gbmV3IFRbaV07IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOPgpzdHJ1Y3QgbmV3X2ltcGw8VFtOXT4KewoJdHlwZWRlZiBUKiB0eXBlOwoJCiAgICBzdGF0aWMgVCogY2FsbCgpIHsgcmV0dXJuIG5ldyBUW05dOyB9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uQXJncz4KdHlwZW5hbWUgbmV3X2ltcGw8VD46OnR5cGUgbmV3XyhBcmdzJiYuLi4gYXJncykgewogICAgcmV0dXJuIG5ld19pbXBsPFQ+OjpjYWxsKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7Cn0KCmludCBtYWluKCkKewogICAgaW50KiB0MSA9IG5ld188aW50PigpOwogICAgaW50KiB0MiA9IG5ld188aW50W10+KDIwKTsKICAgIGludCogdDMgPSBuZXdfPGludFsyMF0+KCk7CgogICAgcmV0dXJuIDA7Cn0KCg==