Упорядоченный шаблон дизайна класса / структуры - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь написать общий шаблон c для структуры данных, которая создается из входящего потока («сообщения») из нескольких частей. Подразделы сообщения упорядочены стандартным способом, определяемым сообщением «категория» (чтобы избежать использования типа как не cpp тип), и каждая подчасть относится к типу cpp. Например, сообщение категории A может выглядеть как [int x, double y]. Я хотел бы написать структуру для каждой категории сообщений для чтения в данных. Я знаю, что cpp не имеет отражения, которое позволяло бы ему естественным образом упорядочивать элементы данных класса / структур, однако порядок / возможность перебирать членов структуры с информацией о типе был бы именно тем, что мне нужно. Каковы параметры шаблона проектирования, которые позволят перебирать элементы структуры? Например, при инициализации структура может иметь std::vector<void*>, который инициализируется для всех элементов данных, но это не несет информацию о типе, и я не могу придумать, как в общем случае сказать, что элемент данных должен быть включен или где в векторе он находится сидит.

Было бы идеально иметь что-то вроде дизайна:

struct MessageA
{
    Ordered<int> x_;
    Ordered<double> y_;

    MessageA(int x, double y):
        x_(0, x), y_(1, y)
    ...
}

Возможно, с унаследованным классом OrderedStruct, а также

1 Ответ

0 голосов
/ 13 апреля 2020

Вот пример структуры, оборачивающей кортеж. Затем дочерний класс определяет типы в сообщении и перечислении для именования «members». Доступ должен осуществляться через <>, так как тип зависит от этого мета-аргумента

/* 
 *  message.cpp
 */ 

#include <iostream>
#include <tuple>


template<typename ...Ts>
struct MessageBase
{
    std::tuple<Ts...> data;

    template<size_t i>
    // auto get() -> decltype( std::get<i>(data) ) 
    auto&& get() // C++ 14
    {
        return std::get<i>(data);
    }
};

struct Message : MessageBase<int, double>
{
    enum position : std::size_t {x, y};
};

int main()
{
    Message msg;
    msg.data = std::make_tuple(1, 3.14);
    msg.get<msg.x>() = 2;
    std::cout << msg.get<msg.x>() << " " << msg.get<msg.y>() << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...