Voglio implementare un livello di protocollo che si trova sopra lo stack TCP / IP. Esiste un insieme limitato di PDU che possono essere inviati e per ciascuna PDU esiste una classe che la rappresenta in una forma strutturata. Ogni classe ha una funzione per serializzare i dati strutturati in un modulo pronto per la trasmissione e deserializzarli in una forma strutturata.
Queste PDU sono strutturalmente molto diverse, ad esempio:
struct a_associate_ac : property
{
a_associate_ac() = default;
void from_pdu(std::vector<unsigned char> pdu) override;
std::vector<unsigned char> make_pdu() const override;
pdu::TYPE type() const override;
std::string called_ae;
std::string calling_ae;
std::string application_context;
struct presentation_context
{
enum class RESULT
{
ACCEPTANCE = 0x00, USER_REJEC = 0x01,
PROV_REJEC_NO_REASON = 0x02,
ABSTR_CONT_NOT_SUPP = 0x03,
TRANFS_SYNT_NOT_SUPP = 0x04
};
presentation_context() = default;
unsigned char id;
RESULT result_;
std::string transfer_syntax;
};
std::vector<presentation_context> pres_contexts;
std::size_t max_message_length;
};
rispetto a:
struct a_associate_rj: property
{
a_associate_rj() = default;
void from_pdu(std::vector<unsigned char> pdu) override;
std::vector<unsigned char> make_pdu() const override ;
pdu::TYPE type() const override;
enum class SOURCE : unsigned char
{
UL_SERVICE_USER = 0x01, UL_SERVICE_PROV_ACSE = 0x02,
UL_SERVICE_PROV_PRESREL = 0x03
};
enum class REASON : unsigned char
{
NOT_SPECIFIED = 0x01, APPL_CONT_NOT_SUPP = 0x02, CALLING_AE_NOT_RECOG = 0x03,
CALLED_AE_NOT_RECOG = 0x07
};
REASON reason_;
SOURCE source_;
};
Tutte queste classi ereditano da una proprietà di superclasse astratta. la proprietà viene utilizzata dalla classe layer, che implementa il protocollo, in due funzioni membro:
void send(const property* p);
std::unique_ptr<const property> receive();
Questo significa che se l'utente della classe layer riceve una proprietà e vuole accedere ai suoi membri, deve verificare quale tipo di proprietà è stata ricevuta usando property::type()
e downcast a quel tipo, che trovo piuttosto irritante.
Cosa si può fare per risolvere questo problema?