2010-08-10 4 views
8

У меня небольшая проблема с шаблонами:C++ Шаблон по умолчанию конструктор

template <typename T> 
T Func(){ 
    std::string somestr = ""; 
    // somestr = ... 
    if (somestr != ""){ 
     return boost::lexical_cast<T>(somestr); 
    } 
    else{ 
     T ret; // warning: "ret may be uninitialized in this function" 
     return ret; 
    } 
} 

Если эта функция не может получить результат, я хочу, чтобы вернуть правильный объект, но пустой, как это возможно. Если я сделаю это, как указано выше, я получаю предупреждение «ret может быть неинициализирован в этой функции». Try-Catch не помогает удалить предупреждение.

Есть ли способ для этого, как ключевое слово default в C#?

return default(T); // C# 

Спасибо!

ответ

21

ret может быть неинициализирован, потому что T может быть типом POD или другим типом, у которого нет конструкторов, объявленных пользователем.

Вы можете вызвать конструктор по умолчанию (и значение инициализации любого объекта типа POD) следующим образом:

T ret = T(); 
return ret; 

или, более кратко,

return T(); 

Это предполагает, что T по умолчанию-конструктивны , Если вам может понадобиться создать экземпляр этой функции с типом, который по умолчанию не является конструктивным, вы можете взять «по умолчанию» в качестве параметра. Например,

template <typename T> 
T Func(const T& default_value = T()) 
{ 
    // ... 
} 

Это позволит вам по-прежнему называть Func() для типов, которые по умолчанию конструктивно, но и явно указать значение для возврата для типов, которые не являются.

+2

Очень хороший ответ Джеймс. – user373215

Смежные вопросы