Я пишу довольно много кода, который обрабатывает протоколы сообщений. Довольно часто протокол сообщений будет иметь общий кадр сообщения, который можно десериализовать из последовательного порта или сокета; кадр содержит тип сообщения, и полезная нагрузка сообщения должна обрабатываться на основе типа сообщения.
Обычно я пишу полиморфный набор классов с помощью методов доступа и конструктор, который ссылается на кадр сообщения.
Мне кажется, что вместо того, чтобы создавать класс accessor на основе ссылки на фрейм сообщений, я мог бы просто получить классы доступа непосредственно из фрейма сообщения, а затем reinterpret_cast из кадра сообщения в соответствующий класс доступа. Это делает код более кратким и экономит несколько байтов и процессорных циклов.
См. пример (чрезвычайно надуманный и сжатый) ниже. Очевидно, что для производственного кода это все должно быть правильно инкапсулировано, литье сделало членом производного класса, улучшило разделение наложенных проблем и добавило некоторую валидацию. Все это было удалено для составления краткого примера.
#include <iostream>
#include <cstring>
#include <vector>
struct GenericMessage
{
GenericMessage(const char* body):body_(body, body+strlen(body)){}
std::vector<char> body_;
};
struct MessageType1:public GenericMessage
{
int GetFoo()const
{
return body_[2];
}
int GetBar()const
{
return body_[3];
}
};
int main()
{
GenericMessage myGenericMessage("1234");
MessageType1* myMgessageType1 = reinterpret_cast<MessageType1*>(&myGenericMessage);
std::cout << "Foo:" << myMgessageType1->GetFoo() << std::endl;
std::cout << "Bar:" << myMgessageType1->GetBar() << std::endl;
return 0;
}
Я никогда этого не видел. Есть ли недостаток в отливке от базы до производной таким образом, учитывая, что у производного нет дополнительных элементов данных?