gpt4 book ai didi

c++ - Boost递归变体

转载 作者:行者123 更新时间:2023-11-30 03:43:58 27 4
gpt4 key购买 nike

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

using my_variant_t = variant<int, function<void (recursive_wrapper<my_variant_t>)>>;

也就是说,可以是 int 的变体,或者接受相同类型的变体作为参数的函数。但这当然会失败,因为 ‘my_variant_t’ 没有在此范围内声明。好的,接下来我尝试 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);

然后它失败并显示没有匹配的调用

我假设我遗漏了一些东西或以某种方式滥用了变体。有人可以帮我解决这个问题吗?

最佳答案

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

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

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

我不确定它是否可以完成,但它会非常困难(在编译期间对编译器进行正确和严格的操作)

关于c++ - Boost递归变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35785819/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com