我想做的基本上是(简化但重现问题):
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
。我以为我缺少某种东西或以某种方式滥用了变体。有人可以帮我解决这个问题吗?
最佳答案
您只是期望过多的递归变量占位符系统。
库发现并替换模板参数列表中的类型是一回事(例如std::vector<_>
,其中_
是recursive_variant_
占位符)。
完全期望在模板参数列表内的函数签名内检测到(并替换掉)占位符是另一回事。
我不确定是否可以完成此操作,但这会非常困难(在编译过程中正确选择编译器)