xml*_*lmx 8 c++ return default-value default-constructor c++11
我有一个类如下:
class VeryVeryVeryLongTypeName
{
bool is_ok;
VeryVeryVeryLongTypeName() : is_ok(false) {}
};
VeryVeryVeryLongTypeName f()
{
VeryVeryVeryLongTypeName v;
... // Doing something
if (condition_1 is true)
{
return v;
}
else
{
return VeryVeryVeryLongTypeName();
}
... // Doing something
if (condition_2 is true)
{
return v;
}
else
{
return VeryVeryVeryLongTypeName();
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这个陈述return VeryVeryVeryLongTypeName();非常乏味和丑陋,所以,我的问题是:
如何优雅地返回默认初始化的对象?
或换句话说:
将功能添加到C++标准中以使以下声明合法是一个好主意吗?
return default; // instead of return VeryVeryVeryLongTypeName();
Run Code Online (Sandbox Code Playgroud)
goj*_*oji 17
这非常简洁:
return {};
Run Code Online (Sandbox Code Playgroud)
您可以使用此类,其实例将自动隐式转换为所需类型的实例.即使标记了默认构造函数explicit 或者您仍在使用C++ 03,这也应该有效.对于C++ 11,接受的答案简洁而且更好.
const struct default_t
{
template<typename T>
operator T() const { return T{}; }
}default_{};
Run Code Online (Sandbox Code Playgroud)
并将其用作:
VeryVeryVeryLongTypeName f()
{
//...
return default_;
}
WithExplicitConstructor_VeryVeryVeryLongTypeName g()
{
//...
return default_;
}
Run Code Online (Sandbox Code Playgroud)
在线演示.
您可以在任何地方使用此解决方案,即使在模板中
template<typename T>
typename father::template daughter<T>::grand_son_type h()
{
//...
return default_;
}
Run Code Online (Sandbox Code Playgroud)
希望有所帮助.