如何优雅地返回默认初始化的对象
How to elegantly return an object that is default-initialized?
>我有一个这样的类:
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();
}
}
我认为return VeryVeryVeryLongTypeName();
陈述非常乏味和丑陋,所以,我的问题是:
如何优雅地返回默认初始化的对象?
或者换句话说:
在C++标准中添加一个功能以使以下声明合法是一个好主意吗?
return default; // instead of return VeryVeryVeryLongTypeName();
这要简洁得多:
return {};
您可以使用此类,其实例将自动隐式转换为所需类型的实例。即使默认构造函数标记为 explicit
或者您仍在使用 C++03,这也应该有效。对于C++11,公认的答案是简洁和更好的。
const struct default_t
{
template<typename T>
operator T() const { return T{}; }
}default_{};
并将其用作:
VeryVeryVeryLongTypeName f()
{
//...
return default_;
}
WithExplicitConstructor_VeryVeryVeryLongTypeName g()
{
//...
return default_;
}
在线演示。
您可以在任何地方使用此解决方案,即使在模板中也是如此:
template<typename T>
typename father::template daughter<T>::grand_son_type h()
{
//...
return default_;
}
希望有帮助。
typedef
怎么样?
class VeryVeryVeryLongTypeName;
typedef class VeryVeryVeryLongTypeName S;
然后使用S
.
看这里
正如其他人指出的那样,您可以依赖定义类型别名。在 C++11 中,您可以使用符号
using SnappyName = VeryVeryVeryLongTypeName;
然后在您想要的任何位置使用SnappyName
。
请记住,您需要回到您的代码,例如六个月后。使用一种方法可以帮助您(或您的合作者)明确理解您的意思。请记住:代码只写一次,读很多次。代码是为了以后的可读性,而不是为了节省击键。
您会收到问题的解决方案,但您应该注意一些事情。您编写函数的方式可以防止像NVRO那样的复制逃避。
该标准授权编译器从临时中跳过无用的副本,但它存在一些准则来匹配条件以实现优化。
在函数体中,您必须返回相同的同名 objet 而不返回任何其他内容,或者始终返回对象构造。将两者混合在一起,您将失去非常有价值的优化。
相关文章:
- C++使用整数的压缩数组初始化对象
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 在 c++ 中初始化对象
- C++ 手动分配和初始化对象
- 使用运算符"="在C++中用值初始化对象
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- 如何初始化对象数组?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 如何在线程中初始化对象,然后在其他地方使用它?
- 在没有默认构造函数时使用垃圾数据初始化对象
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 在 c++ 中复制对未初始化对象的引用
- 在成员变量在另一个文件中发生更改后,调用与初始化对象分开的函数
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 复制 CTOR 与赋值运算符以初始化对象(性能)
- 当您通过分配初始化C 对象时会发生什么
- 获取未初始化对象成员的地址是否定义良好?