Вот

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

Код что-то вроде следующего

template <class C>
class A
{

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

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

 Kiril Kirov12 янв. 2011 г., 14:12
Я не уверен, что ты имеешь в виду ..
 Gaurav12 янв. 2011 г., 14:35
@CashCow Не было однозначного ответа на этот вопрос, поэтому снова спрашиваю.
 Gaurav12 янв. 2011 г., 14:14
@Kiril Обновлено Q

Ответы на вопрос(2)

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

Или, если ваша функция имеет тип возврата не voidT (спасибо 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 Больше подробностей.

 Gaurav12 янв. 2011 г., 14:26
@Konrad Я пытался использовать is_default_constructible, но он не работает. В частности, я получаю def const даже для классов, которые не имеют ни малейшего представления, в чем может быть проблема :-(. Спасибо.
 Konrad Rudolph12 янв. 2011 г., 14:15
@DeadMG: потому что это работает только дляvoid, В OP не указан тип возврата ...
 Puppy12 янв. 2011 г., 14:14
Почему бы не использовать enable_if в типе возвращаемого значения и предотвратить необходимость использования пустого аргумента? Кроме того, я считаю, что вам требуетсяtypename там.
 Konrad Rudolph12 янв. 2011 г., 14:20
@Gaurav: если вы не можете использовать Boost, просто скопируйте заголовокenable_if шаблон.
 Gaurav12 янв. 2011 г., 14:16
@ Конрад Я не получил код, ты можешь написать подробно, также я не могу использовать повышение. Спасибо

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

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

Ваш ответ на вопрос