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;
}