如何使 C++ 类型名嵌套自身并 "infinitely" 递归?

How can I make a C++ typename nest itself and "infinitely" recurse?

我正在尝试使用我创建的一个整洁的小型 JSON 解析库将这部分 JSON 转换为 C++ 类型。

[
 "a",
   [
      "b",
      [
         "c",
         [  
            "d", 
            ["... so on so forth"] 
         ]
      ]
   ]
]

目前,从技术上讲,这就是 C++ 中类型的样子,但这显然是无效的,因为类型名无法引用自身:

typename std::variant<std::string, std::vector<requirements_type>> requirements_type;

有什么方法可以制作一个无限循环的类型名来处理这种结构?

如评论中所述,您不能拥有像 requirements_type 这样的无限嵌套类型。一个类型的对象的大小是有限的。同样在实践中,您的 JSON 不会无限嵌套。你需要在某处停止嵌套。

类型别名不能引用自身,但您可以在声明其成员时引用 class:

struct requirements_type {
    std::variant< std::string, std::vector< requirements_type > > data;
};

如463035818_is_not_a_number的回答所述

我可以使用引用自身的 class 而不是 typename

struct RequirementArray {
    std::variant<std::string, std::vector<RequirementArray>> self;
};

我可以使用这个简单的方法递归:

void recurseAndOutput(RequirementArray array, int i) {
  try {
    std::vector<RequirementArray> requirementArrays = std::get<std::vector<RequirementArray>>(array.self);
    for (RequirementArray requirementArray: requirementArrays) {
      recurseAndOutput(requirementArray, i + 1);
    }
  } catch (std::bad_variant_access const & ignored) {
    std::string string = std::get<std::string>(array.self);
    printf("%s - %i", string.c_str(), i);
  }
}