У меня небольшая проблема с шаблонами:
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#
Спасибо!
ret
может быть неинициализирован, потому что T
может быть типом POD или другим типом, у которого нет объявленных пользователем конструкторов.
Вы можете вызвать конструктор по умолчанию (и инициализировать значение любого объекта типа POD) следующим образом:
T ret = T();
return ret;
или, более кратко,
return T();
Это предполагает, что T
является конструируемым по умолчанию. Если вам может понадобиться инстанцировать эту функцию с типом, который не является конструируемым по умолчанию, вы можете взять в качестве параметра случай "по умолчанию". Например,
template <typename T>
T Func(const T& default_value = T())
{
// ...
}
Это позволит вам по-прежнему вызывать Func()
для типов, конструируемых по умолчанию, но также явно предоставлять возвращаемое значение для типов, которые таковыми не являются.