C ++ самораскрывающийся класс - PullRequest
0 голосов
/ 30 марта 2020

Я столкнулся с проблемой создания оболочки для какой-то сложной структуры данных. Допустим, у меня есть сообщения, которые имеют некоторые общие функции и абсолютно разные «подробные» поля, которые должны храниться в одной структуре. Я создал два класса, один из которых является «базовой» структурой, а второй обрабатывает дополнительные данные внутри этих «специальных» полей. Позвольте мне показать код, над которым я работаю.

Вот 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 типами ...

Мой желаемый эффект - получить доступ к самораскрывающемуся классу. Это возможно? Я пришел сюда, чтобы помочь Богам Переполнения Стека, чтобы найти ответы.

...