Это классический случай для SFINAE и enable_if
.
В другом ответе Potatoswatter уже опубликовал черту типа is_default_constructible
, которую можно использовать здесь:
void createObj(
typename enable_if_c<is_default_constructible<C>::value, void>::type* dummy = 0)
{
C* objPtr = new C();
}
void createObj(
typename disable_if_c<is_default_constructible<C>::value, void>::type* dummy = 0)
{
C* objPtr = 0;
}
Или, если ваша функция имеет тип возврата не void T
(благодаря DeadMG), вы можете опустить фиктивный аргумент по умолчанию:
typename enable_if_c<is_default_constructible<C>::value, T>::type createObj()
{
C* objPtr = new C();
}
typename disable_if_c<is_default_constructible<C>::value, T>::type createObj()
{
C* objPtr = 0;
}
SFINAE означает, что шаблон, который не может быть создан для данного типа, не будет. enable_if_c
в основном приводит к допустимому типу тогда и только тогда, когда его аргумент равен true
. Теперь мы используем метафункцию is_default_constructible
, чтобы проверить, имеет ли тип C
конструктор по умолчанию. Если это так, enable_if_c<…>::type
приведет к допустимому типу, в противном случае он не будет.
Таким образом, компилятор C ++ увидит только одну из двух функций, а не ту, которая может использоваться в вашем контексте. Для получения более подробной информации см. Документацию enable_if
.