必须使用普通旧数据的情况示例

Examples of the situations where the use of Plain Old Data is must?

本文关键字:数据 情况      更新时间:2023-10-16

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_(); }
};

嗯,我想不出第三种情况了…

解析通信协议是另一种。

相关文章: