提升递归变体

Boost recursive variant

本文关键字:递归      更新时间:2023-10-16

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

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_)。

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

我不确定是否可以完成,但这将是非常困难的(在编译过程中正确和努力地使用编译器)