#include <iostream>
//===========================================
#define new static_assert(false, "'new' is not available");
#pragma push_macro("new")
#undef new
template<typename Type, typename ...Args>
void priv_PlacementNew(Type *ptr, Args&& ...args)
{
new (ptr) Type(std::forward<Args>(args)...);
}
#pragma pop_macro("new")
//===========================================
class MyClass
{
public:
MyClass(int value) : value(value) { }
void Print() { std::cout << "Print() = " << value << std::endl; }
private:
int value = 0;
};
int main()
{
unsigned char *bytes = (unsigned char*)malloc(sizeof(MyClass));
MyClass *myClass = reinterpret_cast<MyClass*>(bytes);
//new (myClass) Type(357); //<<<---------- FAILS TO COMPILE (as desired)
priv_PlacementNew(myClass, 357);
myClass->Print();
myClass->~MyClass();
free(bytes);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiNkZWZpbmUgbmV3IHN0YXRpY19hc3NlcnQoZmFsc2UsICInbmV3JyBpcyBub3QgYXZhaWxhYmxlIik7CgojcHJhZ21hIHB1c2hfbWFjcm8oIm5ldyIpCiN1bmRlZiBuZXcKCnRlbXBsYXRlPHR5cGVuYW1lIFR5cGUsIHR5cGVuYW1lIC4uLkFyZ3M+CnZvaWQgcHJpdl9QbGFjZW1lbnROZXcoVHlwZSAqcHRyLCBBcmdzJiYgLi4uYXJncykKewogICAgbmV3IChwdHIpIFR5cGUoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKfSAKCiNwcmFnbWEgcG9wX21hY3JvKCJuZXciKQovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmNsYXNzIE15Q2xhc3MKewpwdWJsaWM6CglNeUNsYXNzKGludCB2YWx1ZSkgOiB2YWx1ZSh2YWx1ZSkgeyB9CgkKCQoJdm9pZCBQcmludCgpIHsgc3RkOjpjb3V0IDw8ICJQcmludCgpID0gIiA8PCB2YWx1ZSA8PCBzdGQ6OmVuZGw7IH0KCQoJcHJpdmF0ZToKCWludCB2YWx1ZSA9IDA7Cn07CgppbnQgbWFpbigpCnsKCXVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhzaXplb2YoTXlDbGFzcykpOwoJTXlDbGFzcyAqbXlDbGFzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8TXlDbGFzcyo+KGJ5dGVzKTsKCQoJLy9uZXcgKG15Q2xhc3MpIFR5cGUoMzU3KTsgLy88PDwtLS0tLS0tLS0tIEZBSUxTIFRPIENPTVBJTEUgKGFzIGRlc2lyZWQpCgkKCXByaXZfUGxhY2VtZW50TmV3KG15Q2xhc3MsIDM1Nyk7CgkKCW15Q2xhc3MtPlByaW50KCk7CgkKCW15Q2xhc3MtPn5NeUNsYXNzKCk7CglmcmVlKGJ5dGVzKTsKCQoJcmV0dXJuIDA7Cn0=