【问题标题】:Boost recursive variant提升递归变体
【发布时间】:2016-06-17 14:01:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ boost variant


    【解决方案1】:

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

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

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

    我不确定这是否可以完成,但这会非常困难(在编译过程中正确且严格地使用编译器)

    【讨论】:

    • 确实,我认为这是 mpl 占位符的一个限制,它们在 x&lt;_1&gt;x&lt;_1,_2&gt; 等模板中工作,但不是 x&lt;_1(_2)&gt;。幸运的是,boost::function 有一种形式,它将存储函数的签名作为类型序列 (function1&lt;void,recursive_variant_&gt;)。关于函数调用运算符,他不能那样使用它,因为variant 没有定义它,他需要使用访问者,但我不确定它是否有意义(你怎么称呼3(42)?或f(42)(其中 f 将 `function 作为参数)?)。
    • @cv_and_he ✔ 使用 boost 函数1 成功了。你也对,调用变体函数很棘手。我不得不把它写成boost::get&lt;function1&lt;void, my_variant_t&gt;&gt;(x)(42);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    相关资源
    最近更新 更多