C ++模板默认构造函数

时间:2010-08-10 01:13:29

标签: c++ templates constructor default keyword

模板有点问题:

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无法删除警告..

有没有办法像C#中的default关键字一样?

return default(T); // C#

谢谢!

1 个答案:

答案 0 :(得分:23)

ret可能未初始化,因为T可能是POD类型或其他没有用户声明的构造函数的类型。

您可以调用默认构造函数(并对任何POD类型对象进行值初始化),如下所示:

T ret = T();
return ret;

或者,更简洁,

return T();

这假设T是默认构造的。如果您可能需要使用不是默认构造的类型来实例化此函数,则可以将“默认”大小写作为参数。例如,

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

这样您仍然可以为默认可构造的类型调用Func(),但也可以为非类型的类型显式提供值。