【问题标题】:Template on member function in lambda deduced using auto使用 auto 推导出的 lambda 中的成员函数模板
【发布时间】:2017-10-24 16:15:11
【问题描述】:

在下面的代码中,events 是一个基于模板策略构建的 stl 容器,其中底层类型由入站和出站类型组成。

auto events = process::run<inbound, outbound>(args);

处理完事件后,我需要根据运行时参数做一些计算。这是一个例子:

cool::transform(events.deltas(), [](const auto &current) { return current.method(); });

我们可能想要使用几种方法,即我们可以调用另一个可能返回或不返回相同底层类型的方法。

cool::transform(events.deltas(), [](const auto &current) { return current.other(); });

有没有办法对此进行模板化,以便我可以声明:

cooler::transform<method>(events.deltas())

额外问题:如果方法实际存在于底层类型上,我们可以使用模板来启用代码吗?

【问题讨论】:

    标签: c++ templates lambda stl


    【解决方案1】:

    有没有办法对此进行模板化,以便我可以声明:

    并非如此 - 没有将“方法”作为模板参数传递的无问题方式。您将遇到重载/模板成员函数的问题。您目前拥有的 lambda 解决方案是最好的解决方案 - 我建议将 current 缩短为 c 并使用 auto&amp;&amp; 以减少样板:

    cool::transform(events.deltas(), [](auto&& c){ return c.method(); });
    

    如果方法实际存在于底层类型上,我们可以使用模板来启用代码吗?

    是的,您可以使用detection idiom 来检查表达式是否有效。我写了一篇文章,介绍了它和其他更强大/更简洁的技术:"checking expression validity in-place with C++17"

    【讨论】:

    • 谢谢,直到我看到它,我仍然忘记了 auto&&。在第一个问题上,将 lambda 声明为一些可调用并使用该信息的问题是什么?如果我将 method() 从底层类型类定义中移出,而是将其声明为内联方法会怎样?
    猜你喜欢
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多