Я столкнулся с проблемой создания оболочки для какой-то сложной структуры данных. Допустим, у меня есть сообщения, которые имеют некоторые общие функции и абсолютно разные «подробные» поля, которые должны храниться в одной структуре. Я создал два класса, один из которых является «базовой» структурой, а второй обрабатывает дополнительные данные внутри этих «специальных» полей. Позвольте мне показать код, над которым я работаю.
Вот Message.hxx
:
namespace mgm = meta::game::message;
namespace shared::common::message
{
class Message
{
std::unique_ptr<mgm::Message> mp_data;
public:
[[nodiscard]] std::uint64_t getMessageId() { return mp_data->id(); }
[[nodiscard]] std::uint8_t getSender() { return mp_data->sender(); }
[[nodiscard]] std::uint8_t getRecipient() { return mp_data->recipient(); }
[[nodiscard]] std::string getInfo() { return mp_data->info()->str(); }
[[nodiscard]] std::uint64_t getServerTimeStamp() { return mp_data->server_time_stamp(); }
};
}
namespace scm = shared::common::message;
Вот класс "detail", который на самом деле не реализован, но это не так важно SimpleMessage.hxx
:
namespace shared::common::message
{
class SimpleMessage
: public Message
{
};
}
Я думал,
Эй, может быть, я добавлю вычет / специализацию типа шаблона! Звучит как отличная идея!
MessageResolver.hxx
namespace
{
namespace mgm = meta::game::message;
}
namespace shared::common::message
{
class Message;
class SimpleMessage;
template<mgm::Request RESPONSE_TYPE, mgm::Response REQUEST_TYPE>
class MessageResolver : std::false_type {};
template<>
struct MessageResolver<mgm::Request::Request_SimpleRequest, mgm::Response_SimpleResponse>
{
SimpleMessage* operator ()(Message* message)
{
return reinterpret_cast<SimpleMessage*>(message);
}
};
}
и добавьте код в мой Message.hxx
класс ...
namespace mgm = meta::game::message;
namespace shared::common::message
{
class Message
{
std::unique_ptr<mgm::Message> mp_data;
public:
[[nodiscard]] std::uint64_t getMessageId() { return mp_data->id(); }
[[nodiscard]] std::uint8_t getSender() { return mp_data->sender(); }
[[nodiscard]] std::uint8_t getRecipient() { return mp_data->recipient(); }
[[nodiscard]] std::string getInfo() { return mp_data->info()->str(); }
[[nodiscard]] std::uint64_t getServerTimeStamp() { return mp_data->server_time_stamp(); }
[[nodiscard]] decltype(MessageResolver<req,resp>()) get() { return MessageResolver<req,resp>(); };
};
}
namespace scm = shared::common::message;
и в этот момент мои мечты рухнули. Я не могу инициализировать это утверждение с не constexpr
типами ...
Мой желаемый эффект - получить доступ к самораскрывающемуся классу. Это возможно? Я пришел сюда, чтобы помочь Богам Переполнения Стека, чтобы найти ответы.