c – 无状态类函子何时用于代替c风格函数?

c – 无状态类函子何时用于代替c风格函数?,第1张

概述我已经在SO上找到了一些很好的仿函数示例,例如 this,并且所有令人信服的示例似乎都使用了定义operator()的类中的状态. 我在一本书中遇到了一个例子,它定义了函数调用 *** 作符而没有状态,我不禁觉得这是一个尴尬的用法,而且一个普通的样式函数指针,比使用operator()更好.这里的每一个方法 – 更少的代码,更少的变量(你必须实例化比较器),它可能由于实例化而更有效,并且没有意义或封装的损 我已经在SO上找到了一些很好的仿函数示例,例如 this,并且所有令人信服的示例似乎都使用了定义operator()的类中的状态.

我在一本书中遇到了一个例子,它定义了函数调用 *** 作符而没有状态,我不禁觉得这是一个尴尬的用法,而且一个普通的样式函数指针,比使用operator()更好.这里的每一个方法 – 更少的代码,更少的变量(你必须实例化比较器),它可能由于实例化而更有效,并且没有意义或封装的损失(因为它只是一个函数).

我知道std :: sort允许你在operator()类和函数之间进行选择,但由于上面的逻辑,我总是只使用这些函数.

为什么选择课程的原因是什么?

这是一个例子(释义):

class Point2D {   //.. accessors,constructors   int x,y;};class HorizComp {public:   bool operator()(const Point2D& p,const Point2D& q) const   { return p.getX() < q.getX(); }};class VertComp {public:   bool operator()(const Point2D& p,const Point2D& q) const   { return p.getY() < q.getY(); }};template <typename E,typename C>voID printSmaller(const E& p,const E& q,const C& isLess) {   cout << (isLess(p,q) ? p : q) << endl; // print the smaller of p and q}//...// usage in some function:Point2D p(1.2,3.2),q(1.5,9.2);HorizComp horizComp;VertComp vorizComp;printSmaller(p,q,horizComp);printSmaller(p,vorizComp);
解决方法 典型的原因是当你这样做时:
bool less_than(const Point&,const Point&);// ...std::sort(...,&less_than);

谓词的模板参数如下:

bool(const Point&,const Point&)

由于sort函数接收函数指针,因此编译器更难以内联std :: sort()中的谓词用法.这是因为你可以有另一个功能

bool greater_than(const Point&,const Point&);

它具有完全相同的类型,这意味着std :: sort()instatiation将在两个谓词之间共享. (记住,我说它使内联更难,而不是不可能).

相反,当你这样做:

struct less_than {    bool operator()(const Point&,const Point&) const;};// ...std::sort(...,less_than());struct greater_than {    bool operator()(const Point&,greater_than());

编译器为每个谓词生成std :: sort()的唯一模板实例化,从而更容易内联谓词的定义.

总结

以上是内存溢出为你收集整理的c – 无状态类函子何时用于代替c风格函数?全部内容,希望文章能够帮你解决c – 无状态类函子何时用于代替c风格函数?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1237024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存