C ++ 98の共用体には、仮想関数または重要なコンストラクターまたはデストラクターを持つクラスを含めることはできません。
PODの使用が必要な場所を知っている状況は何ですか?
構文
X a = {1, 2, 3};
std::initializer_list
この制限はC++11で解除されますが、PODでのみ機能します。
たとえば、バイナリファイルの一部の構造を解析します
非C++API(通常はCスタイルのAPI)と対話する場合。
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番目のケースは考えられません…
通信プロトコルの解析は別のものです。