如何使 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);
}
}
我正在尝试使用我创建的一个整洁的小型 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);
}
}