Des*_*ess 3 c++ visual-studio-2017
在C++ 17中,是否可以声明这样的东西,使其编译:
struct Foo;
using Var = std::variant<Type1, Type2, Foo>; // uses Foo
struct Foo {
std::vector<Var> member; // uses Var
}
Run Code Online (Sandbox Code Playgroud)
这是一个简化的例子,但我需要一个像这样的递归数据结构.
对的,这是可能的.您只需要某种间接/容器,它可以与不完整的类型一起正常工作.例子有: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{}}};
}
Run Code Online (Sandbox Code Playgroud)
需要间接以避免定义"无限大小"变体.以下是有关该主题的一些学习资源:
David Sankel的"变体:过去,现在和未来" CppCon 2016讲座是对变体的一个很好的介绍,涵盖了"递归变体".
我在"使用lambdas pt.2访问变体"文章中简要介绍了"递归变体".