Как проверить, является ли аргумент шаблона конструируемым по умолчанию - PullRequest
5 голосов
/ 12 января 2011

Я пишу шаблонный класс и хочу узнать, является ли аргумент шаблона конструируемым по умолчанию , есть ли способ сделать это?

Код выглядит примерно так:

template <class C>
class A
{

createObj()
{
C* objPtr = NULL;
// If default constructible then create object else let it remain NULL
}
};

Обновление: я пытался использовать код, указанный в этом вопросе , но он не работает, если быть точным, если вернутьконструктор по умолчанию даже для тех классов, которые не являются, я понятия не имею, почему это происходит.

Ответы [ 2 ]

3 голосов
/ 12 января 2011

Это классический случай для 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.

1 голос
/ 12 января 2011

Это случай SFINAE, вы используете перегрузку функции, которая принимает ... в качестве параметра, которая вызывает метод, который вы ищете.

В любом случае, на этот конкретный вопрос дан ответ ` здесь

...