在下面的代码中,events
是一个根据模板策略构建的stl容器,其中基础类型由入站和出站类型组成。
auto events = process::run<inbound, outbound>(args);
处理事件后,我需要根据运行时参数进行一些计算。这是一个例子:
cool::transform(events.deltas(), [](const auto ¤t) { return current.method(); });
我们可能想要使用几种方法,即我们可能会调用另一种方法,该方法可能会也可能不会返回相同的基础类型。
cool::transform(events.deltas(), [](const auto ¤t) { return current.other(); });
有没有办法模板化,所以我可以声明:
cooler::transform<method>(events.deltas())
加分问题:如果方法实际存在于基础类型上,我们是否可以使用模板仅启用代码?
答案 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"。