在为STD模板函数创建函数对象时,还要还原样板

Reducing boilerplate when creating functor objects for std template functions

本文关键字:函数 还原 对象 STD 创建 在为      更新时间:2023-10-16

作为解决另一个问题的解决方案,创建"通用函数对象"似乎很有用,该对象将各种标准(也许是用户定义的(模板函数包装在函数对象中。

这些有时比相应的模板函数更有用,因为当作为函数对象传递时,该函数的特定类型是"绑定较晚"的:仅在Callee内的呼叫站点上,而不是在呼叫者中。例如,您不能将std::min作为函子对象传递,您必须通过诸如std::min<int>之类的实例化,这意味着Callee不能在各种同质类型上运行。

另一方面,您可以通过min_functor如下所示,min的正确实例化将在Callee的每个呼叫侧选择。

struct min_functor {
    template <typename T>
    const T& operator()(const T& l, const T& r) const { return std::min(l,r); }
};

最后,问题是:如果我想为max等各种二进制操作定义其中的几个,等等,除了宏> 1 外,是否有某种方法可以在不复制上面的样板的情况下进行操作。?


1 宏似乎在这里工作得很好,但是我忍不住要面对强大的反马克罗大厅的嘲笑。

no ,因为没有即时上下文命名函数模板,以识别它的专业化。(考虑模板模板参数必须是类或别名模板。(但是,有几个警告:

  1. 这样做的几种语法已是提出的
  2. 可以将函数模板作为参数传递的参数,该参数是函数指针(以无状态为代价,可能没有插入(。
  3. 某些现代设计直接使用函数对象,尽管这实际上只是提前包括相同的样板。