在C ++ 17中,是否可以声明这样的内容,使其编译:
struct Foo;
using Var = std::variant<Type1, Type2, Foo>; // uses Foo
struct Foo {
std::vector<Var> member; // uses Var
}
这是一个简化的例子,但我需要一个像这样的递归数据结构。
答案 0 :(得分:5)
是的,有可能。您只需要某种与不完整类型一起正常工作的间接/容器。例如:std::unique_ptr
,std::vector
和std::map
。
struct Foo
{
std::variant<int, float, std::vector<Foo>> _data;
};
int main()
{
Foo a{std::vector<Foo>{Foo{}, Foo{}}};
}
需要间接以避免定义“无限大小”变体。以下是有关该主题的一些学习资源:
David Sankel的“Variants: Past, Present, and Future" CppCon 2016演讲是对变体的一个很好的介绍,涵盖“递归变体”。
我在"visiting variants using lambdas pt.2"文章中简要介绍“递归变体”。