Конструктор шаблона C ++ по умолчанию - PullRequest
9 голосов
/ 10 августа 2010

У меня небольшая проблема с шаблонами:

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#

Спасибо!

1 Ответ

23 голосов
/ 10 августа 2010

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

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

T ret = T();
return ret;

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

return T();

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...