函数对象以及其特点

Posted jly594761082

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数对象以及其特点相关的知识,希望对你有一定的参考价值。

一、函数对象以及其特点

  1、函数对象:在一个类里面实现()运算符重载;

  2、函数对象的()的执行,很像一个函数//仿函数

  3、函数对象的好处:函数对象属于类对象,能突破函数的概念,能保持调用状态信息,如:for_each算法中,函数对象做函数参数,函数对象做返回值

#include "pch.h"
#include <iostream>
#include"vector"
#include<algorithm>
using namespace std;

//1.函数对象:在一个类里面实现()运算符
template <typename T>
class showElemt
{
public:
    showElemt()
    {
        n = 0;
    }
    void operator()(T &t)
    {
        n++;
        //printN();
        cout << t << " ";

    }
    void printN()
    {
        cout << "n:"<< n << endl;
    }
protected:
    int n;
};

//函数模板
template <typename T>
void funcShowElemt(T &t)
{
    cout << t << endl;
}

void funcShowElemt2(int &t)
{
    cout << t << " ";
}
void test01()
{
    int a = 10;
    showElemt<int> showelemt;
    showelemt(a);//2.函数对象的()的执行,很像一个函数//仿函数
    funcShowElemt<int>(a);
    funcShowElemt2(a);

    return;
}
//3.函数对象的好处:
//函数对象属于类对象,能突破函数的概念,能保持调用状态信息
//如:for_each算法中,函数对象做函数参数,函数对象做返回值
void test02()
{
    vector<int> v1;
    v1.push_back(1);
    v1.push_back(3);
    v1.push_back(5);

    for_each (v1.begin(), v1.end(), showElemt<int>());//匿名函数对象,匿名仿函数
    cout << endl;
    for_each(v1.begin(), v1.end(), funcShowElemt2);//通过回调函数,谁使用for_each,谁去填写回调函数的入口地址
    cout << endl;

    showElemt<int> show1;
    /*_Fn for_each(_InIt _First, _InIt _Last, _Fn _Func)
    {    // perform function for each element [_First, _Last)
    _Adl_verify_range(_First, _Last);
    auto _UFirst = _Get_unwrapped(_First);
    const auto _ULast = _Get_unwrapped(_Last);
    for (; _UFirst != _ULast; ++_UFirst)
        {
        _Func(*_UFirst);
        }
    return (_Func);
    }*/
    show1 = for_each(v1.begin(), v1.end(), show1);//此处函数对象做值传递,不是引用//返回值用匿名对象赋值给show1
    show1.printN();

}
int main()
{
    //test01();
    test02();
    std::cout << "Hello World!\n"; 
}

 

以上是关于函数对象以及其特点的主要内容,如果未能解决你的问题,请参考以下文章

ES6,ES7,Vue的基本认识和特点

Python中的eval(),exec()以及其相关函数

如何键入一个以可调用对象及其参数作为参数的函数 - 例如函数的数值积分?

错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”

解析Xml文件的三种方式及其特点

6.mybatis里面的动态sql是怎么设定的,常用标签有那些以及其