1

C ++ 98の共用体には、仮想関数または重要なコンストラクターまたはデストラクターを持つクラスを含めることはできません。

PODの使用が必要な場所を知っている状況は何ですか?

4

5 に答える 5

2

構文

X a = {1, 2, 3};

std::initializer_listこの制限はC++11で解除されますが、PODでのみ機能します。

于 2012-07-30T13:03:41.377 に答える
2

たとえば、バイナリファイルの一部の構造を解析します

于 2012-07-30T12:53:31.737 に答える
2

非C++API(通常はCスタイルのAPI)と対話する場合。

于 2012-07-30T13:16:11.937 に答える
2

PODnessが必要な1つのケースは、バイトシーケンスとの間で直接変換する場合です。

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

うーん、3番目のケースは考えられません…

于 2012-07-30T13:23:40.143 に答える
1

通信プロトコルの解析は別のものです。

于 2012-07-30T13:01:34.413 に答える