必须使用普通旧数据的情况示例
Examples of the situations where the use of Plain Old Data is must?
C++98中的并集不能包含具有虚拟函数或非平凡的构造函数或析构函数。
您知道哪些情况下必须使用POD?
解析二进制文件中的一些结构,例如
语法
X a = {1, 2, 3};
仅适用于POD,尽管C++11中的std::initializer_list
取消了此限制。
与非C++API(通常是C风格的API)交互时。
需要PODness的一种情况是直接转换为字节序列。
需要PODness的另一种情况是,类型必须保证实例化除了使用一点内存之外没有任何效果,例如在以下类中:
namespace detail {
using std::vector;
template< class Type, Podness::Enum podNess = Podness::isPod >
class ValueWrapper_
{
private:
Type v_;
public:
Type const& ref() const { return v_; }
ValueWrapper_() {} // No initialization
ValueWrapper_( Type const v ): v_( v ) {}
};
template< class Type >
struct ValueWrapper_< Type, Podness::isNotPod >
{
private:
vector<Type> v_; // General but incurs allocation overhead.
public:
Type const& ref() const { return v_[0]; }
ValueWrapper_() {} // Supports apparent no initialization.
ValueWrapper_( Type const v ): v_( 1, v ) {}
};
} // namespace detail
template< class Type >
class Optional_
{
private:
typedef detail::ValueWrapper_<Type, Podness_<Type>::value > Wrapper;
Wrapper const value_;
bool const isNone_;
Optional_& operator=( Optional_ const& ); // No such.
public:
bool isNone() const { return isNone_; }
Type const& value() const
{
hopefully( !isNone_ )
|| throwX( "Optional_::value(): there is no value" );
return value_.ref();
}
Optional_(): isNone_( true ) {}
Optional_( Type const& v ): value_( v ), isNone_( false ) {}
static Optional_ none() { return Optional_(); }
};
template<>
class Optional_< void >
{
private:
Optional_& operator=( Optional_ const& ); // No such.
public:
bool isNone() const { return true; }
void value() const
{
throwX( "Optional_::value(): there is no value" );
}
Optional_() {}
static Optional_ none() { return Optional_(); }
};
嗯,我想不出第三种情况了…
解析通信协议是另一种。
相关文章:
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- 如何在不破坏现有应用程序的情况下更改 API 中 stl 容器的数据类型?
- 在 C++ 中,默认情况下构造函数为类的数据成员提供的值是多少?
- 在不复制数据的情况下,将double数组转换为只有double成员的structs数组
- 有没有一种方法可以在不复制数据的情况下从string_view创建字符串流
- 串行读取()不会在没有数据接收的情况下返回值
- 如何在不复制数据的情况下将 cv::Mat 转换为 2d 标准::矢量
- 如何在没有缓冲的情况下使用 parquet-cpp 写入面向流/行的数据?
- 在不编写显式 setter 的情况下修改私有类数据成员的便捷方法是什么?模板有用吗?
- 在不减慢线程速度的情况下保存大量数据
- 如何对 int 变量应用验证,使其仅接受整数数据,并且在任何其他数据的情况下不会出错?
- 如何在没有性能命中的情况下抽象SIMD代码来处理不同的数据类型
- 是否可以在不分配内存或复制数据的情况下构造对象?
- 如何在不复制数据的情况下在平面数组和多维数组之间进行转换?
- 如何在以下C程序中计算运行时间内存和最大数据存储器使用情况
- 对象无法访问其私人数据.错误:在这种情况下私有
- 如何在不重写整个视频文件的情况下仅替换流中的一个数据框架?(ffmpeg)
- 给定一个填充无符号字符**的 C 函数,如何在没有中间副本的情况下用数据填充 std::vector
- 为什么在以下情况下没有数据竞争