我想做的基本上是(简化但重现问题):

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_占位符)。

完全期望在模板参数列表内的函数签名内检测到(并替换掉)占位符是另一回事。

我不确定是否可以完成此操作,但这会非常困难(在编译过程中正确选择编译器)

10-04 22:27