使用auto推导出lambda中成员函数的模板

时间:2017-10-24 16:15:11

标签: c++ templates lambda stl

在下面的代码中,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())

加分问题:如果方法实际存在于基础类型上,我们是否可以使用模板仅启用代码?

1 个答案:

答案 0 :(得分:1)

  

有没有办法模板化,所以我可以声明:

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

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

如果方法实际存在于基础类型上,我们是否可以使用模板仅启用代码?

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