function<int (int,int)> func=sum

前提

首先需要包括头文件#include<functional>  

基本使用格式 

                        function<返回值类型(参数类型1,参数类型2,...)>  函数名称=实例化函数名称

                        函数名称(变量1,变量2,...)

  • 用函数对象实例化function:函数是一种对象,所以可以作为类型来实例化。这种做法通常被称为“函数实例化”或者“函数构造”
  • 什么是实例化:实例化(Instantiation)是面向对象编程中的一个过程,指的是根据类模板(Class)创建一个具体的对象(Object)。
  • 在实例化过程中,程序会为类分配内存空间,并在该内存空间中创建一个具有特定属性方法对象,这样就可以通过该对象来访问类的属性和方法。
  • 用函数实例化function有什么好处:std::function 是 C++ 标准库提供的一个通用的函数封装类,用于将函数、函数指针、成员函数以及函数对象(包括仿函数)等封装成一个对象,从而可以像普通对象一样进行复制、赋值传递

一般有以下6种函数对象可以实例化function

普通函数
类中成员函数定义在class类中的函数
lambda函数lambda 函数比较轻便,即用即删除,很适合需要完成一项功能,但是此功能只在此一处使用, 连名字都很随意的情况下
仿函数仿函数(Functor)是一个结构体,它实现了函数调用运算符 operator(),使得该类的实例对象可以像函数一样被调用
 静态成员函数定义在class类中的静态成员函数

这里以实现a+b的函数功能为例

1 构建一个函数实例化function

fuction<返回值(参数类型1,参数类型2)> 函数名称=[] (参数类型 参数名,参数类型 参数名)->返回参数类型{ 函数体内容}

int main(){
    function<int(int, int)> func1 = [](int a, int b)->int {
	cout << "直接构建function" << endl;
	return a + b; };
    return 0;
}

2 通过普通函数实例化function

fuction<返回值(参数类型1,参数类型2)> 函数名称=实例化函数名称

int sum(int a,int b){
    return a+b;
}
int main(){
    function<int(int,int)> func2=sum;
    cout<<func2(20,20)<<endl;
    return 0;
}

3 通过类中函数实例化function

fuction<返回值(类名称*,参数类型1,参数类型2)> 函数名称=&类名称::实例化函数名称

class mycode{
public:
    int sum(int a,int b){ return a+b;}

}

int main(){
    function<int(mycode*, int, int)> func3 = &mycode::sum;
    mycode obj;
    cout<<func3(&obj,100,200)<<endl;
    return 0;
}

4 用lambda函数实例化function函数

fuction<返回值(参数类型1,参数类型2)> 函数名称=实例化函数名称

auto sum = [](int a, int b)->int { 
	cout << "正在使用lambda中的sum" << endl;
	return a + b; };
function<int(int, int)> func4 = sum;
cout << func4(100, 200) << endl;

5 用仿函数实例化function

fuction<返回值(参数类型1,参数类型2)> 函数名称=实例化函数名称

struct mycode1 {
	int operator()(int a, int b) { 
		cout << "正在使用仿函数实例化function" << endl;
		return a + b; 
	}
};

int main(){
    function<int(int, int)> func5 = mycode1();
    cout << func5(100, 200) << endl;
    return 0;
}

6 用静态成员函数实例化function

fuction<返回值(参数类型1,参数类型2)> 函数名称=实例化函数名称

class mycode2 {
public:
	static int sum(int a, int b) { 
	cout << "正在使用类静态成员函数实例化function" << endl;
	return a + b; }

};

int main(){
    function<int(int, int)> func6 = mycode2::sum;
    cout << func6(100, 200) << endl;
}

衍生 

通过function进行函数对象实例化,使得封装后的对象可以像普通对象一样赋值,传递。

auto hanshu=func2;
cout<<hansu(20,30)<<endl;
void doshowallbooks() { cout << "查看所有书籍信息" << endl;}
void doborrow() { cout << "借书" << endl; }
void doback() { cout << "还书" << endl; }

int main() {
	int choice = 0;
	map<int, function<void()>> actionMap;
	actionMap.insert({1,doshowallbooks });
	actionMap.insert({ 2,doborrow });
	actionMap.insert({ 3,doback });
    auto iter1 = actionMap.find(1);
    iter1->second();
    auto iter2=  actionMap.find(2);
    iter2->second();
    auto iter3 = actionMap.find(3);
    iter3->second();
    return 0;}

 更多详细内容,可以查看https://www.cnblogs.com/Vergissmeinnicht-rj/p/17196619.htmlicon-default.png?t=N7T8https://www.cnblogs.com/Vergissmeinnicht-rj/p/17196619.html

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误通常出现在解析器(parser)中,表示在解析表达式时没有找到相应的前缀解析函数。在 Monkey 语言中,`=` 是一个中缀运算符,需要对它进行中缀解析(infix parsing)。 在解析器中,每个运算符都有一个对应的前缀解析函数或中缀解析函数。前缀解析函数用于解析前缀表达式,中缀解析函数用于解析中缀表达式。在 Monkey 语言中,`=` 是一个中缀运算符,需要使用中缀解析函数进行解析。 以下是一个示例代码,演示了如何在解析器中添加中缀解析函数: ```go package parser import ( "monkey/token" ) // ... func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression { expression := &ast.InfixExpression{ Token: p.currentToken, Operator: p.currentToken.Literal, Left: left, } precedence := p.currentPrecedence() p.nextToken() expression.Right = p.parseExpression(precedence) return expression } func (p *Parser) registerInfix(tokenType token.TokenType, fn infixParseFn) { p.infixParseFns[tokenType] = fn } func (p *Parser) parseExpression(precedence int) ast.Expression { prefix := p.prefixParseFns[p.currentToken.Type] if prefix == nil { p.noPrefixParseFnError(p.currentToken.Type) return nil } leftExp := prefix() for !p.peekTokenIs(token.SEMICOLON) && precedence < p.peekPrecedence() { infix := p.infixParseFns[p.peekToken.Type] if infix == nil { return leftExp } p.nextToken() leftExp = infix(leftExp) } return leftExp } // ... func (p *Parser) initPrecedences() { p.precedences = make(map[token.TokenType]int) p.precedences[token.EQ] = EQUALS p.precedences[token.NOT_EQ] = EQUALS p.precedences[token.LT] = LESSGREATER p.precedences[token.GT] = LESSGREATER p.precedences[token.PLUS] = SUM p.precedences[token.MINUS] = SUM p.precedences[token.SLASH] = PRODUCT p.precedences[token.ASTERISK] = PRODUCT p.precedences[token.LPAREN] = CALL } // ... ``` 在以上代码中,我们定义了一个`parseInfixExpression`函数,用于解析中缀表达式。然后,我们使用`registerInfix`函数将中缀解析函数注册到解析器中。最后,我们在`initPrecedences`函数中初始化了运算符的优先级。 希望这个回答能够帮助您解决问题。如果您还有其他问题,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值