【问题标题】:C++ Template Default ConstructorC++ 模板默认构造函数
【发布时间】:2011-03-27 14:21:23
【问题描述】:

模板有点问题:

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 may be uninitialized in this function”。 Try-Catch 无助于消除警告..

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

return default(T); // C#

谢谢!

【问题讨论】:

    标签: c++ templates constructor default keyword


    【解决方案1】:

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

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

    T ret = T();
    return ret;
    

    或者,更简洁,

    return T();
    

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-03-01
      • 2014-05-18
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2016-06-24
      • 2012-02-15
      • 1970-01-01
      • 2014-05-15
      相关资源
      最近更新 更多