精华内容
下载资源
问答
  • 那么,回调函数是个什么鬼呢?它和函数到底有何异同?既然已经有了函数,为啥还非要生出个回调函数来?想必,小伙伴们在刚碰到这个概念的时候,都会被这些问题困扰。网上搜搜,有很多相关的材料,但是未必透彻。我...

    在C/C++里面,函数的概念很好理解,就是把某个任务独立出来,封装在一起,然后给它取个名字,它可以有参数和返回值。那么,回调函数是个什么鬼呢?它和函数到底有何异同?既然已经有了函数,为啥还非要生出个回调函数来?想必,小伙伴们在刚碰到这个概念的时候,都会被这些问题困扰。网上搜一搜,有很多相关的材料,但是未必透彻。我觉得要真正理解一个概念,必须要先理解它存在的意义,也就是它为什么要存在,它能带来什么方便之处。在这一点上C++ Primer这本书写的还是比较到位的。仔细阅读之后,我把自己的心得写下来,供大家参考。


    首先,回调函数也是函数,就像白马也是马一样。它具有函数的所有特征,它可以有参数和返回值。其实,单独给出一个函数是看不出来它是不是回调函数的。回调函数区别于普通函数在于它的调用方式。只有当某个函数(更确切的说是函数的指针)被作为参数,被另一个函数调用时,它才是回调函数。就像给你一碗饭,你并不能说它是中饭还是晚饭一样,只有当你在某个时候把它吃掉了你才明确它是中饭还是晚饭(这个比喻貌似有点挫。领会精神就好,哈哈)。

    那么问题来了,为什么我们要把函数作为参数来调用呢,直接在函数体里面调用不好吗?这个问题问的好。在这个意义上,“把函数做成参数”和“把变量做成参数”目的是一致的,就是以不变应万变。形参是不变的,而实参是变的。唯一不同的是,普通的实参可以由计算机程序自动产生,而函数这种参数计算机程序是无法自己写出来的,因为函数本身就是程序(要是程序可以写程序的话那就是超级人工智能了),它必须由人来写。所以对于回调函数这种参数而言,它的“变”在于人有变或者人的需求有变。

    C++ Primer里面举了个例子就是排序算法。为了使排序算法适应不同类型的数据,并且能够按各种要求进行排序,机智的人类把排序算法做成了一个模版(在标准模版库STL里),并且把判断两个数据之间的“大小”(也可以是“字节数”,或者其他某种可以比较的属性)这个任务(即函数)当成一个参数放在排序算法这个函数的参数列表里,而把它的具体实现就交给了使用排序算法的人。这个判断大小的函数就是一个回调函数。比如我们要给某个vector容器里面的单词进行排序,我们就可以声明一个排序算法:

    void stable_sort(vector<string>::iterator iterBegin, vector<string>::iterator iterEnd, 
    bool (*isShorter)(const string &, const string &));

    其中前面两个是普通参数,即迭代器(用于标记vector容器里面元素的位置),而第三个参数isShorter就是回调函数。根据不同需求isShorter可以有不同的实现,包括函数名。比如:

    bool myIsShorter(const string &s1, const string &s2)
    {    
         return s1.size()<s2.size();
    }
    stable_sort(words.begin(),words.end(),myIsShorter);
    
    根据需求你也可以换一种方式来实现。注意,在传递myIsShorter这个参数时,只需写函数名,它代表函数指针。后面绝对不能加()和参数,绝对不能加()和参数,绝对不能加()和参数!因为那样是调用函数的返回值!两者天壤之别!在stable_sort运行时,当遇到需要比较两个单词的长短时,就会对myIsShorter进行调用,得到一个判断。在调用时,还必须把两个单词传递给isShorter供isShorter调用。所以说stable_sort调用了myIsShorter,而myIsShorter又调用了stable_sort给它的单词。它们相互调用。这就是“回调”这两个字的含义!

    虽然说形参不变,实参可变,以不变应万变。但是作为实参有一点还是不能变的,那就是实参的数据类型不能变。比如void foo(int i)这个函数里的参数i可以取1也可以取2,但是它必须是整型的。同样的,回调函数这种参数的类型也不能变。而函数的类型是由函数的参数类型和返回值类型决定的。比如前面提到的排序算法里面,isShorter这个回调函数的参数必须是两个const string类型,返回值必须是bool类型。所以在写回调函数时还是不能太任性,必须要查看一下调用该回调函数的函数的声明。[这里插播一段广告。假如回调函数本应该只有两个参数的,但是我想让它更普适一点,我想传三个参数给它,那怎么办呢?为了解决这个问题,C++标委又发明了lambda表达式和bind函数这两种方法。欲知详情请戳这里这里。]

    总之,所谓回调函数就是把函数当作参数使用。目的是使程序更加普适(正如活字印刷,把可能会“变”的字一个个分离开来,这样就可以任意组合,重复利用)。一般情况下,一个人的小规模程序用不着这种普适性,除非你想把它做成工具箱(比如游戏引擎),供他人使用。

    其实实现这种普适性还有其他方法,比如对虚函数进行重写(或者用纯虚函数。Objective C里面所有函数都是虚函数,而协议相当于纯虚函数)。这样同一个函数就可以有不同的实现。不同的合作者之间就可以通过这种虚函数“协议”进行合作。


    水平有限,如有不妥,欢迎拍砖!


    参考文献

    C++ Primer


    展开全文
  • 回调函数详解

    千次阅读 2018-12-04 19:26:53
    、什么是回调函数   回调函数是指 使用者自己定义个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你...

    一、什么是回调函数

      回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你实现的,但由别人(或系统)的函数在运行时通过参数传递的方式调用,这就是所谓的回调函数。简单来说,当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数

    二、回调函数详解

    1、C语言中的回调函数

      回调函数主要结构有三部分组成:主函数、调用函数和被调函数。C语言中,被调函数通常以函数指针(指向对应函数的入口地址)的形式出现。

    //定义回调函数
    void PrintfText() 
    {
        printf("Hello World!\n");
    }
    
    //定义实现回调函数的"调用函数"
    // 参数为函数指针,无参数返回void
    void CallPrintfText(void (*callfuct)())
    {
        callfuct();
    }
    
    //实现函数回调
    int main(int argc,char* argv[])
    {
        CallPrintfText(PrintfText);
        return 0;
    }
    

      调用函数向其函数中传递void (*callfuct)(void)这是一个void callfuct(void)函数的入口地址,即PC指针可以通过移动到该地址执行void callfuct(void)函数。
      实现函数调用中,函数调用了“调用函数”,再在其中进一步调用被“调用函数”。相比于主函数直接调用“被调函数”,这种方法为使用者,而不是开发者提供了灵活的接口。另外,函数入口可以像变量一样设定同样为开发者提供了灵活性。

    2、C++中的回调函数

    bool myIsShorter(const string &s1, const string &s2)
    {    
         return s1.size() < s2.size();
    }
    // 前面两个是普通参数,即迭代器,第三个参数isShorter就是回调函数
    // 在传递myIsShorter这个参数时,只需写函数名,它代表函数指针
    stable_sort(words.begin(), words.end(), myIsShorter);
    

      stable_sort调用了myIsShorter,而myIsShorter又调用了stable_sort给它的单词,它们相互调用。这就是“回调”这两个字的含义。

    3、回调函数的机制

    (1) 定义一个回调函数;

    (2)提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;

    (3)当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

    三、为什么要用回调函数

      因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。

      如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、归并排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。

      回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。实际上,SetTimer()API使用了一个回调函数来通知计时器,而且,万一没有提供回调函数,它还会把一个消息发往程序的消息队列。

    四、回调函数的优点

    • 可以让实现方,根据回调方的多种形态进行不同的处理和操作。

    • 可以让实现方,根据自己的需要定制回调方的不同形态。

    • 可以将耗时的操作隐藏在回调方,不影响实现方其它信息的展示。

    • 让代码的逻辑更加集中,更加易读。

    五、回调函数总结

      总之,所谓回调函数就是把函数当作参数使用目的是使程序更加普适(正如活字印刷,把可能会“变”的字一个个分离开来,这样就可以任意组合,重复利用)。一般情况下,一个人的小规模程序用不着这种普适性,除非你想把它做成工具箱(比如游戏引擎),供他人使用。

    展开全文
  • JavaScript回调函数

    千次阅读 2015-06-18 10:30:34
    JavaScript API里这样解释:A callback is a function that is passed as an argument to another function and is executed after its parent function has completed....使用回调函数的原因:可以把调
    JavaScript API里这样解释:A callback is a function that is passed as an argument to another function and is executed after its parent function has completed. (回调是一个函数作为参数传递给另一个函数,其母函数完成后执行。)
    使用回调函数的原因:可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。

    一、使用函数处理数组

    求数组的平均值
    方法一(常规方式):
    var data = [1,1,3,5,5];
    var sum = 0;
    for(var i=0; i<data.length; i++){
    	sum += data[i];
    }
    console.log(sum / data.length);
    方法二(函数式):
    var data = [1,1,3,5,5];
    var sum = function(x,y){return x+y;};
    console.log(data.reduce(sum)/data.length);
    PS:对数组中的所有元素调用指定的回调函数;返回值为通过最后一次调用回调函数获得的累积结果。
    array1.reduce(callbackfn[, initialValue])
    如果提供了 initialValue,则 reduce 方法会对数组中的每个元素调用一次 callbackfn 函数(按升序索引顺序)。 如果未提供 initialValue,则 reduce 方法会对从第二个元素开始的每个元素调用 callbackfn 函数。
    回调函数的返回值在下一次调用回调函数时作为 previousValue 参数提供。 最后一次调用回调函数获得的返回值为 reduce 方法的返回值。
    var data = [1,2,3];
    data.reduce(function(x,y){return x+y},2); //8
    data.reduce(function(x,y){return x+y});   //6

    二、回调函数

    示例:数据源为某学生分数,当score<=0由底层处理,当score>0由高层处理。
    /* 回调函数 */
    function f(score,callback1,callback2){
    	if(score <= 0){
    		console.log("调用底层处理函数")
    		/* 使用call函数传参数 */
    		callback1.call(this,score);
    	}else{
    		console.log("调用高层处理函数");
    		/* 使用apply函数传参数 */
    		callback2.apply(this,[score]);
    	}
    }

    /* 底层函数 */
    function subprocess(score){
    	score === 0 ? console.log("该学生未参加考试!") : console.log("输入错误!");
    }
    /* 高层函数 */
    function supprocess(score){
    	if(score >= 90){
    		console.log("该学生成绩优秀!");
    	}else if(score >= 80) {
    		console.log("该学生成绩良好!");
    	}else if(score >= 60){
    		console.log("该学生成绩及格!");
    	}else{
    		console.log("该学生成绩不及格!");
    	}
    }

    /* 匿名函数 */
    var score = 99;
    f(score,function(){
    	score === 0 ? console.log("该学生未参加考试!") : console.log("输入错误!");
    },function(){
    	if(score >= 90){
    		console.log("该学生成绩优秀!");
    	}else if(score >= 80) {
    		console.log("该学生成绩良好!");
    	}else if(score >= 60){
    		console.log("该学生成绩及格!");
    	}else{
    		console.log("该学生成绩不及格!");
    	}
    })

    三、高阶函数

    所谓高阶函数就是操作函数的函数,它接收一个或多个函数作为参数,并返回一个新的函数。
    /* 高阶函数,返回f的返回值的逻辑非 */
    function not(f){
    	return function(){
    		var result = f.apply(this,arguments);
    		return !result;
    	};
    }
    /* 判断x是否为偶数的函数 */
    var even = function(x){
    	return x % 2 === 0;
    };
    
    var odd = not(even);	//一个新函数,所做的事情和even()相反
    [1,1,3,5,5].every(odd); //true,每个元素都是奇数


    展开全文
  • Keras中的回调函数Callbacks详解

    万次阅读 多人点赞 2019-07-07 21:28:58
    回调函数一组在训练的特定阶段被调用的函数集,你可以使用回调函数来观察训练过程中网络内部的状态和统计信息。通过传递回调函数列表到模型的.fit()中,即可在给定的训练阶段调用该函数集中的函数。 虽然我们称之...

    介绍

    回调函数是一组在训练的特定阶段被调用的函数集,你可以使用回调函数来观察训练过程中网络内部的状态和统计信息。通过传递回调函数列表到模型的.fit()中,即可在给定的训练阶段调用该函数集中的函数。
    虽然我们称之为回调“函数”,但事实上Keras的回调函数是一个类

    keras.callbacks.Callback()
    

    是回调函数的抽象类,定义新的回调函数必须继承自该类
    类属性

    • params:字典,训练参数集(如信息显示方法verbosity,batch大小,epoch数)

    • model:keras.models.Model对象,为正在训练的模型的引用

    回调函数以字典logs为参数,该字典包含了一系列与当前batch或epoch相关的信息。

    目前,模型的.fit()中有下列参数会被记录到logs中:

    • 在每个epoch的结尾处(on_epoch_end),logs将包含训练的正确率和误差,acc和loss,如果指定了验证集,还会包含验证集正确率和误差val_acc)和val_loss,val_acc还额外需要在.compile中启用metrics=[‘accuracy’]。

    • 在每个batch的开始处(on_batch_begin):logs包含size,即当前batch的样本数

    • 在每个batch的结尾处(on_batch_end):logs包含loss,若启用accuracy则还包含acc

    from keras.callbacks import Callback
    

    callbacks来控制正在训练的模型

    最开始训练过程是先训练一遍,然后得到一个验证集的正确率变化趋势,从而知道最佳的epoch,设置最佳epoch,再训练一遍得到最终结果,十分浪费时间!!!

    节省时间的一个办法是在验证集准确率不再上升的时候,终止训练。keras中的callback可以帮我们做到这一点。
    callback是一个obj类型的,他可以让模型去拟合,也常在各个点被调用。它存储模型的状态,能够采取措施打断训练,保存模型,加载不同的权重,或者替代模型状态。
    callbacks可以用来做这些事情:

    • 模型断点续训:保存当前模型的所有权重
    • 提早结束:当模型的损失不再下降的时候就终止训练,当然,会保存最优的模型。
    • 动态调整训练时的参数,比如优化的学习率。
    • 等等

    EarlyStopping 早停止

    monitor为选择的检测指标,这里选择检测’acc’识别率为指标,

    • patience当连续多少个epochs时验证集精度不再变好终止训练,这里选择了1

    ModelCheckpoint存储最优的模型

    filepath为我们存储的位置和模型名称,以.h5为后缀,

    • monitor为检测的指标,这里我们检测验证集里面的成功率,
    • save_best_only代表我们只保存最优的训练结果。
    • validation_data就是给定的验证集数据。
    	import keras
    	# Callbacks are passed to the model fit the `callbacks` argument in `fit`,
    	# which takes a list of callbacks. You can pass any number of callbacks.
    	callbacks_list = [
      	# This callback will interrupt training when we have stopped improving
     	 keras.callbacks.EarlyStopping(
      	# This callback will monitor the validation accuracy of the model
      	monitor='acc',
     	 # Training will be interrupted when the accuracy
     	 # has stopped improving for *more* than 1 epochs (i.e. 2 epochs)
     	 patience=1,
      	),
      	# This callback will save the current weights after every epoch
      	keras.callbacks.ModelCheckpoint(
     	 filepath='my_model.h5', # Path to the destination model file
     	 # The two arguments below mean that we will not overwrite the
      	# model file unless `val_loss` has improved, which
      	# allows us to keep the best model every seen during training.
      	monitor='val_loss',
      	save_best_only=True,
      	)
    	]
    	# Since we monitor `acc`, it should be part of the metrics of the model.
    	model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
    	# Note that since the callback will be monitor validation accuracy,
    	# we need to pass some `validation_data` to our call to `fit`.
    	model.fit(x, y,
     		 epochs=10,
      		 batch_size=32,
     	 	 callbacks=callbacks_list,
     		 validation_data=(x_val, y_val))
    

    ReduceLROnPlateau 学习率减少

    	callbacks_list = [
      	keras.callbacks.ReduceLROnPlateau(
     	 # This callback will monitor the validation loss of the model
     	 monitor='val_loss',
      	 # It will divide the learning by 10 when it gets triggered
      	 factor=0.1,
     	 # It will get triggered after the validation loss has stopped improving
    	 # for at least 10 epochs
     	 patience=10,
        )
    	]# Note that since the callback will be monitor validation loss,
    	# we need to pass some `validation_data` to our call to `fit`.
    	model.fit(x, y,
      			epochs=30,
      			batch_size=32,
      			callbacks=callbacks_list,
     			validation_data=(x_val, y_val))
    
    
    • patience 如果连续10个批次,val_loss不再上升,就把学习率弄到原来的0.1倍

    TensorBoard 可视化

    keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, write_graph=True, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None)
    

    TensorBoard是TensorFlow提供的可视化工具,该回调函数将日志信息写入TensorBorad,使得你可以动态的观察训练和测试指标的图像以及不同层的激活值直方图。

    如果已经通过pip安装了TensorFlow,我们可通过下面的命令启动TensorBoard:

    tensorboard --logdir=/full_path_to_your_logs
    
    • log_dir:保存日志文件的地址,该文件将被TensorBoard解析以用于可视化

    LambdaCallback

    keras.callbacks.LambdaCallback(on_epoch_begin=None, on_epoch_end=None, on_batch_begin=None, on_batch_end=None, on_train_begin=None, on_train_end=None)
    

    用于创建简单的callback的callback类

    该callback的匿名函数将会在适当的时候调用,注意,该回调函数假定了一些位置参数:

    • on_epoch_begin和on_epoch_end假定输入的参数是epoch, logs.
    • on_batch_begin和on_batch_end假定输入的参数是batch, logs
    • on_train_begin和on_train_end假定输入的参数是logs

    参数

    • on_epoch_begin: 在每个epoch开始时调用
    • on_epoch_end: 在每个epoch结束时调用
    • on_batch_begin: 在每个batch开始时调用
    • on_batch_end: 在每个batch结束时调用
    • on_train_begin: 在训练开始时调用
    • on_train_end: 在训练结束时调用
    # Print the batch number at the beginning of every batch.
    batch_print_callback = LambdaCallback(
        on_batch_begin=lambda batch,logs: print(batch))
    
    # Plot the loss after every epoch.
    import numpy as np
    import matplotlib.pyplot as plt
    plot_loss_callback = LambdaCallback(
        on_epoch_end=lambda epoch, logs: plt.plot(np.arange(epoch),
                          logs['loss']))
    
    # Terminate some processes after having finished model training.
    processes = ...
    cleanup_callback = LambdaCallback(
        on_train_end=lambda logs: [
        p.terminate() for p in processes if p.is_alive()])
    
    model.fit(...,
          callbacks=[batch_print_callback,
             plot_loss_callback,
             cleanup_callback])
    

    自定义Callback

    如果内置的callback操作还满足不了需求,可以通过继承keras.callbacks.Callback编写自己的回调函数,回调函数通过类成员self.model访问模型,该成员是模型的一个引用。

    简单的保存每个batch的loss的回调函数

    from keras.callbacks import Callback
    class LossHistory(Callback):
    	def on_train_begin(self, logs={}):
    		self.losses = []
    	def on_batch_end(self, batch, logs={}):
    		self.losses.append(logs.get('loss))
    

    将激活值以数组的形式存进磁盘

    class ActivationLogger(keras.callbacks.Callback):
      	def set_model(self, model):
      		# This method is called by the parent model before training, 
      		# to inform the callback of what model will be calling it
      		self.model = model
      		layer_outputs = [layer.output for layer in model.layers]
      		# This is a model instance that returns the activations of every layer
      		self.activations_model = keras.models.Model(model.input, layer_outputs)
      		def on_epoch_end(self, epoch, logs=None):
     		 	if self.validation_data is None:
      				raise RuntimeError('Requires validation_data.')
     			 # Obtain first input sample of the validation data
     			validation_sample = self.validation_data[0][0:1]
      			activations = self.activations_model.predict(validation_sample)
      			# Save arrays to disk
     			 f = open('activations_at_epoch_' + str(epoch) + '.npz', 'w')
     			 np.savez(f, activations)
     			 f.close()
    

    参考文档:
    https://keras-cn.readthedocs.io/en/latest/other/callbacks/

    展开全文
  • 浅谈C++回调函数

    千次阅读 2018-02-28 22:09:30
     回调函数就是个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数回调函数不是由该函数的实现方直接调用,而是在...
  • tensorflow回调函数

    千次阅读 2019-01-08 13:39:35
    回调函数一组在训练的特定阶段被调用的函数集,你可以使用回调函数来观察训练过程中网络内部的状态和统计信息。通过传递回调函数列表到模型的.fit()中,即可在给定的训练阶段调用该函数集中的函数。 【Tips】虽然...
  • 回调函数C++11

    千次阅读 2018-12-10 22:05:27
    回调函数就是个通过函数指针调用的函数。我们是通过这个函数指针来调用其指向的函数,这就是我们说的回调机制(Callback)。 为什么使用回调机制(Callback) 原因:使用回调机制可以编写与被调用函数中的逻辑无关...
  • C语言 回调函数详解

    千次阅读 2020-03-03 09:14:04
    但是回调函数的理解和使用却不是件简单的事,在本篇我们根据我们个人的理解和应用经验对回调函数做简要的分析。 1、什么是回调函数  既然谈到了回调函数,首先我们就要搞清楚什么是回调函数。在讨论回调函数...
  • 回调函数的作用

    万次阅读 多人点赞 2017-03-12 09:02:09
    回调函数的作用 原文地址:http://wmnmtm.blog.163.com/blog/static/3824571420105484116877/ 一直不太理解回调函数的作用,下面是找到的一些关于回调函数的作用的解答。...2.回调函数就相当于个中断处
  • 【C语言】用回调函数实现冒泡排序

    千次阅读 2018-08-21 18:47:09
    )什么是回调函数呢? 回调函数就是通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。 (二)回调函数的实现...
  • Java 回调函数

    千次阅读 2011-03-03 16:41:00
    回调函数只是个功能片段,由用户按照回调函数调用约定来实现的个函数。回调函数个工作流的部分,由工作流来决定函数的调用(回调)时机。回调函数包含下面几个特性: 1、属于工作流的个部分;...
  • 1.概念  在编写程序的时候,我们通常会在主函数中调用库里的各种函数,这个过程叫做调用,函数在调用的时候通常需要...这时候的库函数就调用了你编写的函数,这个过程就叫做回调。  这时被库函数调用的函数,也就是
  • Keras自写CallBacks回调函数

    千次阅读 2019-04-19 15:23:15
    回调函数(CallBacks)是一组在训练的特定阶段被调用的函数集,你可以使用回调函数来观察训练过程中网络内部的状态和统计信息。通过传递回调函数列表到模型的.fit()中,即可在给定的训练阶段调用该函数集中的函数。 ...
  • 在进行软件开发的过程中,常会用到一些声明为CALLBACK 的函数,这些函数就是回调函数。使用 回调函数可以改善软件的结构、提高软件的复用性。比如,在个规模较大的软件项目中,可以将一些资 源或相对独立的处理模块...
  • js函数回调

    万次阅读 多人点赞 2019-07-31 19:09:41
    平常的前端开发工作中,编写js时会有很多地方用到函数回调。 最简单的例子就是: <script language="javascript" type="text/javascript"> function doSomething(callback) { if(typeof callback == ...
  • 一文搞懂C语言回调函数

    万次阅读 多人点赞 2019-07-09 00:40:58
    博主:Rdou Typing 来源:segmentfault 什么是回调函数 ...回调函数就是个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另个函数,当这个指针被用来调用其所指向的函数时,我...
  • 首先是回调函数:(摘自百度百科)回调函数就是个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数
  • 类中静态回调函数应用

    千次阅读 2014-01-14 11:47:55
    回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。 分析原因: 普通的C++成员...
  • opencv 之 鼠标事件,回调函数

    千次阅读 2018-04-17 09:54:08
    主要介绍 鼠标事件的函数原型及参数 回调函数的原型及参数 鼠标事件画矩形的例子指定鼠标操作消息回调函数的函数为SetMouseCallback函数。函数原型: void SetMouseCallback(const string &amp; winname,...
  • 回调函数和钩子函数的区别

    万次阅读 2017-07-05 22:50:28
    在消息处理机制中必不可少的一组CP,即回调和钩子。钩子的概念源于Windows的消息处理机制,通过设置钩子,应用程序可以对所有的消息事件进行拦截,然后执行钩子函数,对消息进行想要的处理方式。接下来是一段js代码...
  • .NET 回调函数

    千次阅读 2008-04-21 09:41:00
    回调函数的调用将从托管应用程序中,通过个 DLL 函数,间接地传递给托管实现。在用平台调用调用的多种 DLL 函数中,有些函数要求正确地运行托管代码中的回调函数。本主题将介绍托管函数的元素,并说明如何实现...
  • 回调函数在C++11中的另种写法

    千次阅读 2018-03-28 11:40:30
    C++11之前写回调函数的时候,一般都是通过 typedef void CALLBACK (*func)();方式来声明具有某种参数类型、返回值类型的通用函数指针。上面例子声明了个返回值是void,无参数的函数指针。其中,返回值和参数可以...
  • 回调函数(函数指针的应用)

    千次阅读 2016-05-03 19:41:15
    # 本篇博客主要阐述回调函数,函数指针的概念,并且使用回调函数实现冒泡排序,可以 实现不同数据类型的排序。...回调函数就是个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另 个函数,
  • Linux 回调函数

    万次阅读 2011-02-24 14:11:00
    回调函数:如果参数是个函数指针,调用者可以传递个函数的地址给实现者,让实现者去调用它,这称为回调函数(Callback Function)。回调机制包括两部分:服务执行者和服务方式制定者。 1. 服务执行者先制定服务...
  • C#回调函数

    万次阅读 2011-11-21 14:42:11
    C#回调函数应用示例,形象比喻方法助理解,整理了个简单的例子来说明回调函数的用法: namespace CallBackFunction {  class Program  {  static void Main(string[] args)  {  Program prog = ...
  • ms-help://MS.MSDNQTR.2003FEB.2052/...对回调函数的调用将从托管应用程序中,通过个 DLL 函数,间接地传递给托管实现。在用平台调用调用的多种 DLL 函数中,有些函数要求正确地运行托管代码中的回调函数。本主
  • Keras回调函数Callbacks使用详解及训练可视化介绍功能History(训练...回调函数一组在训练的特定阶段被调用的函数集,你可以使用回调函数来观察训练过程中网络内部的状态和统计信息。通过传递回调函数列表到模型的...
  • 回调函数(附例子)适合菜鸟小白

    万次阅读 2016-06-29 14:41:21
    转载来自... 看了人家的例子,比看那么多定义好多了。看就明白了。...非把个简单的东西复杂化。...回调函数:我的理解。假设 A是回调函数,B是调用者,
  • 因为函数的类型由它的返回类型和形参类型共同决定,与函数名无关,所以想要声明函数指针,只需要用指针替换函数名即可,例如:比较字符串长度的函数:bool LengthCompare(const string &amp;, const string ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 227,780
精华内容 91,112
关键字:

一组回调函数