提升递归变体

时间:2016-03-04 00:28:24

标签: c++ boost variant

我想要做的主要是(简化但重现问题):

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失败。

我认为我在某种程度上缺少某些东西或滥用变体。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

您只是期望过多的递归变体占位符系统。

库在模板参数列表中找到并替换类型是一回事(例如std::vector<_>,其中_是例如recursive_variant_占位符。

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

我不确定它是否可以完成,但这将非常困难(在编译期间在编译器上做正确和努力)