C++ 模板默认构造函数

标签 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#

谢谢!

最佳答案

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

您可以像这样调用默认构造函数(并值初始化任何 POD 类型对象):

T ret = T();
return ret;

或者,更简洁地说,

return T();

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

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

这将允许您仍然为默认可构造的类型调用 Func(),但也可以显式提供一个值以返回给不可构造的类型。

关于C++ 模板默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3445348/

相关文章:

c++ quaternion 澄清

c++ - floor 在不同的平台上给出不同的结果

javascript模板继承

javascript - 在可伸缩性、性能和处理复杂 html 图形方面最好的 javascript 模板引擎是什么?

java - 继承和静态工厂方法

c++ - 混合基类的虚拟和非虚拟继承

C++ 指针传递和引用传递

c++ - Vim Syntastic 显示警告并设置警告级别

php - 从 HTML 表单生成 HTML 文件

java - 在调用 super 构造函数之前检查变量的有效性