C ++ Реализация дерева, содержащего несколько типов с шаблонами - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь реализовать сложную структуру для своего проекта, но не знаю, что делать дальше.

Сама структура представляет собой дерево, в котором каждый узел имеет строковый идентификатор и либо дерево или контейнер для одного из поддерживаемых типов данных, что-то вроде json data.

tree: {
    value1: 4,
    value2: {
        value3: 40.2f,
    }
}

Теперь мне удалось заставить что-то работать в C, но я хотел бы узнать больше о C ++ и шаблоны, поэтому я пытаюсь сделать здесь что-нибудь более чистое. Я мог бы использовать очень мощный nlohmann json и надеяться достичь чего-то подобного, но я бы ничего не узнал.

Мой большой вопрос заключается в том, как справиться с тем фактом, что конечные точки имеют несколько типы. Я имел в виду это, входя в проект:

template<class T>
class basic_node {
    private:
        std::string id;
        std::map<const std::string&, T> contents;
};

Но определение дерева вызовет несколько проблем, T будет повторяться, как высота дерева, и может содержать только один единственный тип данных .

Теперь, покопавшись в коде, я обнаружил следующее:

template<template<typename U, typename V, typename... Args> class ObjectType =
         std::map,
         template<typename U, typename... Args> class ArrayType = std::vector,
         class StringType = std::string, class BooleanType = bool,
         class NumberIntegerType = std::int64_t,
         class NumberUnsignedType = std::uint64_t,
         class NumberFloatType = double,
         template<typename U> class AllocatorType = std::allocator,
         template<typename T, typename SFINAE = void> class JSONSerializer =
         adl_serializer>
class basic_json;

Нужно ли мне что-то подобное, чтобы разрешить многотипные деревья?

1 Ответ

0 голосов
/ 06 мая 2020

Я искал какое-то время и нашел решение. Я хотел избежать C, насколько мог, но, в конце концов, что такое C++, а C с кучей вещей?

Комментарии верны, используя std::variant или объединение - это путь к go, и не бойтесь использовать указатели на следующие узлы.

Существует также множество вещей, которые можно выполнить с типами значений для случаев переключения и возвращаемых значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...