Конструктор шаблонов 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#

Спасибо!

9
задан opatut 10 August 2010 в 01:44
поделиться

1 ответ

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

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

T ret = T();
return ret;

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

return T();

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

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

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

23
ответ дан 4 December 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: