#include <cstdio>
#include <cstdlib>
#include <utility>
#include <new>

struct A {
    int i;

    A( int i = 0 ) : i( i ) {}
};

template<class T>
struct New {
    template <class ... Args>
    static T* item( Args ... args ) {
        T *data = (T*)malloc( sizeof(T) );
        new(data) T( std::forward<Args>( args ) ... );
        return data;
    }
};

int main() {

    A* a = New<A>::item( 42 );

    printf( "%i\n", a->i );

    return 0;
}
