我想要做的主要是(简化但重现问题):
using my_variant_t = variant<int, function<void (recursive_wrapper<my_variant_t>)>>;
即,可以是int的变体,或者接受与参数相同类型的变体的函数。但这当然失败了,因为‘my_variant_t’ was not declared in this scope
。好的,接下来我尝试make_recursive_variant
。
using my_variant_t = make_recursive_variant<int, function<void (recursive_variant_)>>::type;
这个编译。到现在为止还挺好。但是当我尝试使用它时......
my_variant_t x = [](my_variant_t p) {};
然后它失败了......大量的编译器输出......但我认为Failed to specialize function template
是重要的一点。
通过反复试验,我发现如果我改为编写lambda,我可以编译它:
my_variant_t x = [](recursive_variant_ p) {};
但那不是我所期待的。根据文档,我希望能够引用结果变体类型my_variant_t
。更糟糕的是,当我试图调用这个lambda时......
x(42);
然后它以no match for call
失败。
我认为我在某种程度上缺少某些东西或滥用变体。有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
您只是期望过多的递归变体占位符系统。
库在模板参数列表中找到并替换类型是一回事(例如std::vector<_>
,其中_
是例如recursive_variant_
占位符。
完全希望在模板参数列表中的函数签名中检测(并替换)占位符是另一回事。
我不确定它是否可以完成,但这将非常困难(在编译期间在编译器上做正确和努力)