C++ 用模板实现一个包含多种类型的树。

问题描述 投票:0回答:1

我正试图为我的一个项目实现一个复杂的结构,但我不知道如何进行。

这个结构本身是一棵树,其中每个节点都有一个字符串id,并且是一棵树或者是支持的数据类型之一的容器,有点像json数据。

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;

我需要这样的东西来允许多类型树吗?

c++ templates syntax tree
1个回答
0
投票

我找了一会儿,找到了一个解决方案。我想避免 C 尽可能多,但最后,什么是?C++ 不过 C 与一堆东西 ?

评论是正确的,使用 std::variant 或联合是最好的方法,不要害怕使用指向下一个节点的指针。

此外,还有一堆东西可以用开关壳和返回值的值类型来做。

© www.soinside.com 2019 - 2024. All rights reserved.