マップに複数のタイプのオブジェクトを格納したいと思い、この解決策を思いつきました。私は各オブジェクトの型を知っていなければならないので、boost :: anyを使うことはできません。これを行うにはより良い方法がありますか、これは容認できる解決策ですか?マップに複数のタイプを格納する
enum eType
{
TYPE_STRING,
TYPE_NUMBER,
};
class CType
{
public:
int GetType() { return m_Type; }
protected:
int m_Type;
};
template <typename T>
class CData : public CType
{
public:
CData(const T & rData, int iType)
{
m_Type = iType;
m_Data = rData;
}
T & GetData() { return m_Data; }
private:
T m_Data;
};
std::map<unsigned long, CType *> map_Data;
void main()
{
// Create a new data with TYPE_NUMBER
CData<short> data(32767, TYPE_NUMBER);
// Add it to the map
map_Data[0] = &data;
// Get the type
switch (map_Data[0]->GetType())
{
case TYPE_NUMBER:
{
// Cast the first element to CData
CData<short> * pField = (CData<short> *)map_Data[0];
// Print the data
printf("Data: %d\n", pField->GetData());
}
break;
case TYPE_STRING:
{
// Cast the first element to CData
CData<std::string> * pField = (CData<std::string> *)map_Data[0];
// Print the data
printf("Data: %s\n", pField->GetData().c_str());
}
break;
}
}
実行しようとしましたか?また 'void main'は存在しません – TemplateRex
確かに私は試みました、それはVisual Studioで動作します。 – JOkle
あなたは意見を求めています。あなたがそれを実行した場合、コンパイラはそれを受け入れました。それで十分ですか? – CAB