Varolan iki sınıf vardır; biri, beton türü değerini döndüren SrcField
ve diğeri, karşılık gelen veri türünü tanımlayan bir DSTField
birleşimidir.Bu gereksiz C++ kodunu nasıl basitleştirebilirim?
class SrcField
{
public:
signed char GetInt8();
unsigned char GetUInt8();
short GetInt16();
unsigned short GetUInt16();
int GetInt32();
unsigned int GetUInt32();
float GetFloat();
double GetDouble();
bool GetBool();
DataType GetType();
private:
DataType m_type;
DSTField m_data;
};
union DSTField
{
signed char m_int8;
unsigned char m_uint8;
short m_int16;
unsigned short m_uint16;
int m_int32;
unsigned int m_uint32;
float m_float;
double m_double;
bool m_bool;
};
Her iki sınıfı da kullandığımda, uygulama aşağıdaki gibidir. Çok gereksiz; şablonları, jenerik programlama, vb. gibi basitleştirmek için iyi bir yol var mı? şu şekilde görünecektir std::variant
kodunuzu kullanarak
int main()
{
SrcField sf;
DSTField df;
switch(sf.GetType())
{
case TYPE_INT8:
df.m_int8 = sf.GetInt8();
break;
case TYPE_UINT8:
df.m_uint8 = sf.GetUInt8();
break;
case TYPE_INT16:
df.m_int16 = sf.GetInt16();
break;
case TYPE_UINT16:
df.m_uint16 = sf.GetUInt16();
break;
case TYPE_INT32:
df.m_int32 = sf.GetInt32();
break;
case TYPE_UINT32:
df.m_uint32 = sf.GetUInt32();
break;
case TYPE_FLOAT:
df.m_float = sf.GetFloat();
break;
case TYPE_DOUBLE:
df.m_double = sf.GetDouble();
break;
case TYPE_BOOL:
df.m_bool = sf.GetBool();
break;
default:
break;
}
}
Nasıl "varyant" veya "std :: variant" desteği hakkında? –
Neden getters kullanıyorsunuz? –
..ya da "boost :: any" (türlerin kısıtlı olması durumunda bile varyantı tercih ederim.) – Nim