私は組合を持っています:
union my_union
{ short int Int16; float Float; };
作成したい:
const my_union u1 = ???;
const my_union u2 = ???;
それぞれの値を異なるタイプに初期化します:u1-> int16 u2-> float
それ、どうやったら出来るの ?上記が不可能な場合、回避策はありますか?
ユニオンには任意の数のコンストラクターを含めることができます-これはコンストラクターのない任意のデータ型で機能するため、文字列を除外する (または文字列へのポインターを作成する) 場合の例は適切です
#include <string>
using namespace std;
union my_union
{
my_union(short i16):
Int16(i16){}
my_union(float f):
Float(f){}
my_union(const string *s):
str(s){}
short int Int16; float Float; const string *str;
};
int main()
{
const my_union u1 = (short)5;
const my_union u2 = (float)7.;
static const string refstr= "asdf";
const my_union u3 = &refstr;
}
ユニオンによって所有されるクラスを作成するより複雑な方法があります。クラスにはセレクター (使用されるスカラーまたはベクトル データ型) が必要です - 文字列を正しく破棄するためです。
非 POD メンバー データの禁止にもかかわらず (上記で詳しく説明したように)、標準は次のように述べています。
at 8.5.1.15: 中かっこで囲まれた初期化子を使用して共用体を初期化する場合、中かっこには、共用体の最初のメンバーの初期化子のみを含める必要があります。
それで
const my_union u1 = {1};
動作するはずですが、このフォームは 2 番目 (およびそれ以降) のメンバーには使用できません。
ユニオンには文字列などの非PODデータ型を含めることはできないため、質問は無意味です。