SFINAE
class A
{
public:
    A(int a) {a;};
    void init() {};
};

class B
{
public:
    B() {};
    void init(int b) {b;};
};

template<class T>
typename enable_if<is_constructible<T, int>::value, T>::type * CreateAndInitializeAsyncEx(int i)
{
    T* t = new T(i);
    t->init();
    return t;
}

template<class T>
typename enable_if<!is_constructible<T, int>::value, T>::type * CreateAndInitializeAsyncEx(int i)
{
    T* t = new T();
    t->init(i);
    return t;
}

void foo()
{
    A* pA = CreateAndInitializeAsyncEx<A>(3);
    B* pB = CreateAndInitializeAsyncEx<B>(3);

    pA;pB;
}