我想通用化大量的內存,這可能是從二進制文件加載,並且消息ID是已知的,我需要爲每個內存塊創建新的實例。做這個的最好方式是什麼?如何去除這種開關盒?
目前的情況是我需要添加每個新增的消息類型到下面的開關案例。
struct Message1;
struct Message2;
void UnSerialize(int messageId, void* data) {
switch (messageId) {
case MESSAGE1:
Message1* m1 = new Message1;
std::memcpy(m1, data, sizeof(Message1));
m1.dump();
delete m1;
break;
case MESSAGE2:
Message2* m2 = new Message2;
std::memcpy(m2, data, sizeof(MESSAGE2));
m2.dump();
delete m2;
break;
default:
std::cout << "Unknown Message Type.";
break;
}
}
我可以在C++中寫下類似下面的東西嗎?沒有C++ 11和提升可能嗎?
MessageTypeList tl;
tl.append(Message1);
tl.append(Message2);
void UnSerialize(MessageTypeList tl, int messageId, void* data) {
{
foreach(type t : tl) {
if (t::id == MessageId) {
t instance = new t;
memcpy(t, data, sizeof(t));
instance.dump();
delete instance;
}
}
}
你的假設'UnSerialize'相當於到'void UnSerialize(MessageTypeList tl,int messageId,void * data){}'。它沒有副作用,除了泄漏的記憶。對於這個問題,最初的'void UnSerialize(int messageId,void * data)'也是如此。所有分配的內存應該發生什麼? – 2014-09-21 01:23:42
在switch語句中創建消息後,消息會發生什麼變化?如果你只是在做一個memcpy,爲什麼信息的類型很重要? (類的memcpy可能非常糟糕)。 – 2014-09-21 01:28:19
你的代碼無效,'memcpy'正在複製一個指針的大小。 'new Message1;'不適用於不完整的類型。你顯然沒有理由使用動態分配。 – 2014-09-21 03:56:33