精华内容
下载资源
问答
  • 函数指针模板参数

    2018-04-13 22:31:30
    同样,函数指针型模板参数的意义在于:在变与不变之间取得最优实现。通常函数指针的作用是实现回调...将回调函数指针作为被调用函数的参数时,实现的是动态回调,只有在运行时才能确定是回调哪个函数。如果并不需要...

    同样,函数指针型模板参数的意义在于:在变与不变之间取得最优实现。通常函数指针的作用是实现回调(callback),即由调用方将所需要操作包装成某个函数f0,并将指向此函数的指针&f0作为参数传递给函数f1。函数f1在运行时回调所指函数f0,从而实现调用方所期待操作。f0就是一个回调函数。将回调函数指针作为被调用函数的参数时,实现的是动态回调,只有在运行时才能确定是回调哪个函数。如果并不需要动态回调,只为方便,在已有算法框架中嵌入所需操作,则动态回调就略显牛刀杀鸡。此时,将回调函数指针从函数参数移到模板参数,就很容易实现“静态回调”。

    注意 之所以在“静态回调”上加引号,是因为其并不能算做严格的“回调”。回调函数指针是在编译时给定,在模板实例中,就相当于将原本用指针进行回调的地方用所给函数代替,成为完全普通的函数调用。这样也节省了一点点读取指针值确定函数入口的额外运行开销。

    例3.1虽然看起来有些古怪,却演示了函数指针型模板参数的用法。假设对某一数组,需要先依次打印数组元素,依次将元素加1,依次打印,依次将元素减1,再依次打印。

    之所以强调“依次”,是因为对于数组及其他任何序列来说,“依次”操作是一种最常见的需求。但很遗憾,无论C或者C++,都未将“依次”作为内建支持。每次都用for循环语句来遍历数组固然可行,却会使代码看起来冗长。更好的做法是将“依次”抽象成可复用代码,比如一个foreach函数,再将对数组元素所做操作包装成一个回调函数,并将其指针传入foreach函数即可。当操作有限且已知时,显然应该将函数指针从foreach函数参数移至模板参数实现“静态回调”。了解用意后,就不难理解例3.1的代码了。

    例3.1
    #include <iostream>

    // 定义一个foreach函数模板,对数组的每一个元素进行某种操作
    // 具体操作由模板的函数指针参数指定
    template<typename T, void (*f)(T &v)>
    void foreach(T array[], unsigned size)
    {
        for (unsigned i = 0; i < size; ++i) f(array[i]);
    }

    // 三个函数模板用来定义对数组元素的操作
    template<typename T>
    void inc(T &v) {++v;}

    template<typename T>
    void dec(T &v) {--v;}

    template<typename T>
    void print(T &v) {std::cout << ' ' << v;}

    int main()
    {
        int array[] = {1, 2, 3, 4, 5, 6, 7, 8};

        using namespace std;
        foreach<int, print<int> >(array, 8);
        cout << endl;

        foreach<int, inc<int> >(array, 8);
        foreach<int, print<int> >(array, 8);
        cout << endl;

        foreach<int, dec<int> >(array, 8);
        foreach<int, print<int> >(array, 8);
        cout << endl;

        return 0;
    }

    例3.1中,foreach定义为一个函数模板,其第二个模板参数是一个函数指针。由于模板参数必须在编译时给定,所以这个foreach函数实现了“静态回调”。另有一个值得注意的是,第二个模板参数void(*f)(T*v)的定义中用到第一个模板参数T。这是合法的,在模板参数列表中,所声明模板参数可立即用于定义随后的模板参数。在本例中,void (*f)(T*v)约束指针型模板参数f所指函数只能接受与前一模板参数类型相同的指针参数,随后所定义的三个函数模板都是要对数据元素进行的操作,分别是对元素值加1、减1以及打印。在main函数中则调用foreach函数模板,静态绑定对数组每个元素分别加1、减1以及打印。

    展开全文
  • 参数 optstring为选项字符串, 告知 getopt()可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果在处理期间遇到了...

    使用getopt函数解析命令行参数

    基本说明:

    百度百科:
    函数说明 getopt()用来分析命令行参数。参数argc和argv分别代表参数个数和内容,跟main()函数的命令行参数是一样的。参数 optstring为选项字符串, 告知 getopt()可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果在处理期间遇到了不符合optstring指定的其他选项getopt()将显示一个错误消息,并将全域变量optopt设为“?”字符,如果不希望getopt()打印出错信息,则只要将全域变量opterr设为0即可。
    getopt-百度百科

    根据百科解释可看出getopt是一个方便的用来解析命令行参数的函数,使用optstring作为所有需解析选项的集合,并使用全局变量optarg指向选项的附加参数。
    函数原型如下:

    	#include <unistd.h>
    	int getopt(int argc, char * const argv[], const char *optstring);
    	extern char *optarg;
    	extern int optind, opterr, optopt;
    

    看看man手册中getopt的相关描述

    DESCRIPTION
           The  getopt()  function  parses  the  command-line  arguments.  Its arguments argc and argv are the argument count and array as passed to the
           main() function on program invocation.  An element of argv that starts with '-' (and is not exactly "-" or "--") is an option  element.   The
           characters  of  this  element  (aside from the initial '-') are option characters.  If getopt() is called repeatedly, it returns successively
           each of the option characters from each of the option elements.
    
           The variable optind is the index of the next element to be processed in argv.  The system initializes this value to 1.  The caller can  reset
           it to 1 to restart scanning of the same argv, or when scanning a new argument vector.
    
           If  getopt()  finds another option character, it returns that character, updating the external variable optind and a static variable nextchar
           so that the next call to getopt() can resume the scan with the following option character or argv-element.
    
           If there are no more option characters, getopt() returns -1.  Then optind is the index in argv of the  first  argv-element  that  is  not  an
           option.
    
           optstring  is a string containing the legitimate option characters.  If such a character is followed by a colon, the option requires an argu‐
           ment, so getopt() places a pointer to the following text in the same argv-element, or the text of the following argv-element, in optarg.  Two
           colons  mean an option takes an optional arg; if there is text in the current argv-element (i.e., in the same word as the option name itself,
           for example, "-oarg"), then it is returned in optarg, otherwise optarg is set to zero.  This is a GNU extension.   If  optstring  contains  W
           followed  by  a  semicolon, then -W foo is treated as the long option --foo.  (The -W option is reserved by POSIX.2 for implementation exten‐
           sions.)  This behavior is a GNU extension, not available with libraries before glibc 2.
    
           By default, getopt() permutes the contents of argv as it scans, so that eventually all the nonoptions are at the end.  Two  other  modes  are
           also  implemented.   If  the  first  character of optstring is '+' or the environment variable POSIXLY_CORRECT is set, then option processing
           stops as soon as a nonoption argument is encountered.  If the first character of optstring is '-', then each nonoption argv-element  is  han‐
           dled  as if it were the argument of an option with character code 1.  (This is used by programs that were written to expect options and other
           argv-elements in any order and that care about the ordering of the two.)  The special argument "--" forces an end of option-scanning  regard‐
           less of the scanning mode.
    
           If  getopt()  does  not recognize an option character, it prints an error message to stderr, stores the character in optopt, and returns '?'.
           The calling program may prevent the error message by setting opterr to 0.
    
           If getopt() finds an option character in argv that was not included in optstring, or if it detects a missing option argument, it returns  '?'
           and  sets  the  external variable optopt to the actual option character.  If the first character (following any optional '+' or '-' described
           above) of optstring is a colon (':'), then getopt() returns ':' instead of '?' to indicate a  missing  option  argument.   If  an  error  was
           detected,  and  the first character of optstring is not a colon, and the external variable opterr is nonzero (which is the default), getopt()
           prints an error message.
    RETURN VALUE
           If an option was successfully found, then getopt() returns the option character.  If all command-line options have been parsed, then getopt()
           returns  -1.   If  getopt() encounters an option character that was not in optstring, then '?' is returned.  If getopt() encounters an option
           with a missing argument, then the return value depends on the first character in optstring: if it is ':', then ':' is returned; otherwise '?'
           is returned.
    
    

    简单来说,getopt用来解析命令行中以’-'开始的选项参数以及其对应的额外参数(如果有),重复调用可以用来遍历命令行中所有的选项参数。optarg用来指向当前解析出来的选项的额外参数,如果没有则指向NULL。

    getopt中除了optarg变量用于指向选项的附加参数外,还有optind, opterr, optopt三个变量。

    optind是argv中下一个元素的索引,系统初始值为1。如果getopt无法识别一个选项参数,则打印错误信息到stderr标准错误输出上,保存选项的字符到optopt变量上,并返回"?"。可以将opterr设为0来禁止错误信息输出到stderr。

    opterr和optopt这两个参数较少用到。

    例子:

    #include <unistd.h>
    #include <stdio.h>
    
    /* ./test [-l] [-s size] [-f file] */
    int main(int argc, char **argv)
    {
    	int iRet;
    
    	if(argc < 2)
    	{
    		printf("usage:%s [-l] [-s size] [-f file]\n",argv[0]);
    		return -1;
    	}
    	
    	while( (iRet = getopt(argc, argv, "ls:f:")) != -1 )
    	{
    		/* 循环遍历argv参数得到所有的选项参数 */
    		switch(iRet){
    			case 'l':
    			printf("option:%c\n",iRet);
    			break;
    			case 's':
    			printf("option:%c %s\n",iRet, optarg);
    			break;
    			case 'f':
    			printf("option:%c %s\n",iRet, optarg);
    			break;
    			default:
    			printf("usage:%s [-l] [-s size] [-f file]\n",argv[0]);
    			return -1;
    			break;
    		}
    	}	
    
    	return 0;
    }
    
    

    参考:
    getopt 命令行
    Linux下getopt()函数的简单使用


    个人能力有限,如有错误望指出,谢谢!

    展开全文
  • 在QT中,我们的信号函数与槽函数是需要参数匹配的,只有参数匹配了,moc才能将这两个函数联系起来,否则编译器将无法分辨该调用哪个函数。 那么如果出现了,一个信号函数拥有两种不同的参数,我们的槽函数需要如何...

    在QT中,我们的信号函数与槽函数是需要参数匹配的,只有参数匹配了,moc才能将这两个函数联系起来,否则编译器将无法分辨该调用哪个函数。

    那么如果出现了,一个信号函数拥有两种不同的参数,我们的槽函数需要如何申明呢?
    在QT4中,我们的连接使用的是两个不同定义的宏,这样我们可以显式的给出我们需要的参数类型,但是在QT5中,我们一般不使用宏定义,我们对一个连接的声明如下:

    QObject::connect(*sender,&signal,*receiver,&slot);

     

    可以明显看到,我们无法在声明中显示的给出我们需要的参数类型,那么接下来为了解决不同参数的重载问题,我们需要的是显式的创立一个信号函数的指针,下面直接给出例子,例如我需要处理QComBox中的currentIndexChaned信号,这个信号有两种参数,一是QString,另一个是int,我们需要使用的int这个信号函数:

    void (QComboBox::*fun)(int) = &QComboBox::currentIndexChanged;
    QObject::connect(comboBox,fun,*receiver,&slot);

     

    这样,我们传递给槽函数的信号就是int型的了,也就解决了重载信号函数的问题。



    转载于:https://www.cnblogs.com/lixuejian/p/11004607.html

    展开全文
  • 用同一个回调函数switch组件状态发生变化时需要知道它目前开关状态需要知道当前是哪个switch问题描述按照官方文档对switch事件的描述事件名称说明回调参数changeswitch 状态发生变化时的回调函数新状态的值下面这样...

    需求说明

    八个switch组件,用同一个回调函数

    switch组件状态发生变化时需要知道它目前开关状态

    需要知道当前是哪个switch

    问题描述

    按照官方文档对switch事件的描述

    事件名称

    说明

    回调参数

    change

    switch 状态发生变化时的回调函数

    新状态的值

    下面这样写可以满足第二个需求,change回调函数中的参数callback就是开关当前的状态值,默认是boolean类型,但是第三个需求还不能解决.

    v-model="value1"

    @change='changestatus'>

    var vm = new vue({

    el: "#app",

    data: {

    value1: true

    },

    methods: {

    change: function(callback){

    console.log(callback);

    }

    }

    })

    解决办法

    下面代码中的$event就是switch的当前状态值,而num就是自定义的参数

    v-model="value1"

    @change='changestatus($event,1)'>

    v-model="value2"

    @change='changestatus($event,2)'>

    var vm = new vue({

    el: "#app",

    data: {

    value1: true,

    value2: false

    },

    methods: {

    change: function($event,num){

    console.log($event);

    console.log(num);

    }

    }

    })

    拓展知识:基于element-ui(vue版)使用switch时change回调函数中的形参传值问题

    需求说明

    有多个switch组件

    需要知道switch的状态

    表格中当前行(scope.row)的数据

    问题描述

    官方文档中对switch中change的描述:

    目前能得到switch的状态值,但是无法得到change回调中第二个形参的值

    解决方法:

    change回调函数默认形参的实参是$event,其它的实参传自己需要的数据就ok

    以上这篇浅谈elementui中switch回调函数change的参数问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持萬仟网。

    如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

    展开全文
  • 需求说明 八个switch组件,用同一个回调函数...下面这样写可以满足第二个需求,change回调函数中的参数callback就是开关当前的状态值,默认是boolean类型,但是第三个需求还能解决. change='changeStatus'> [removed]
  • python中调用函数时,参数用法通常有以下四种: ...可变参数:当我们确定输入多少参数,但又必须按照顺序收集参数,就需要用到可变参数。 关键字参数:关键字参数在输入时,一定要以参数名 = 参数值这种形..
  • 函数的默认参数的值是依赖对象...如果你的选项不是B,那么你需要跟着我一起来学习一下,虚函数的默认参数到底需要哪个? 标准库规定 就是说,虚函数的默认参数取的是静态类型的。 那么什么是静态类型呢?举个栗子
  • 识别参数类型的一个好处就是,在使用参数集时,不需要每次都指定参数名称了。 请看下面这个Test-Binding函数。这个PowerShell函数在设置参数集的时候,为参数集中的第一个参数设置了数据类型,这样在调用函数时,就...
  • 参数 optstring为选项字符串, 告知 getopt()可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果在处理期间遇到了...
  • 目录零、了解函数一、函数的...扩展性差一、函数的组成函数是由函数名、函数体、返回值、参数四个部分组成:函数名:使用该函数的依据函数体:完成功能的代码块返回值:功能完成的反馈结果参数:完成功能需要的条件...
  • 1-如果你需要为某个函数的所有参数(包括被 this 指针所指的哪个隐喻参数)进行类型转换,那么这个函数必须是个 non-member。 【注】 函数后 + const : 表明该函数为 “只读”。函数不可修改 class 成员; ...
  • 需要哪个模块。模块的作用是什么?abs() 函数返回数字的绝对值。abs() 方法的语法:abs( x )参数:x :数值表达式,可以是整数,浮点数,复数。返回值:函数返回 x(数字)的绝对值,如果参数是一个复数,...
  • constructor-arg子标签:指定创建类对象时使用哪个构造函数,每一对或每一个constructor-arg子标签配置一个参数列表中的参数值;如果配置该子标签,则默认使用无参构造函数实例化对象 调用多参构造方法实例化对象...
  • 关于函数重载,函数覆盖和函数隐藏 区别:函数重载:发生在一个类中,函数必须一样!返回值类型一样并影响! 函数覆盖:发生在基类和派生类...关于重载:根据参数类型或个数的不同来决定调用哪个函数。 关于覆...
  • 需要哪个模块。模块的作用是什么?abs() 函数返回数字的绝对值。abs() 方法的语法:abs( x )参数:x :数值表达式,可以是整数,浮点数,复数。返回值:函数返回 x(数字)的绝对值,如果参数是一个复数,...
  • getopt函数

    2018-12-15 20:34:13
    参数 optstring为选项字符串, 告知 getopt()可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果在处理期间遇到了...
  • 函数重载: C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。 C/C++中程序运行起来,需要经历一下几个...
  • 很多人一直理解VLOOKUP函数第4个参数,输入TRUE(或者输入1,或者什么也不输),与输入FALSE(或输入0),到底有什么区别,到底怎么用。一般的查询中,我们要对匹配条件进行精确的定位,也就是说,不管这个条件是完全...
  • 如果是寄存器方式传递的,就需要确定参数存放在哪个寄存器中。 每一种方式都有其优缺点,而且与使用的编程语言有关系,存在哪种方式好与坏。 我们在开发中经常遇到调用约定类型,如__cdecl、stdcall、PASCAL...
  • 定义:使用哪个函数能在编译时确定的,因为编译器知道用户将要选择哪种类型的对象。所以,编译器必须生成能够在程序运行时选择正确的虚方法的代码,这就是动态联编。 1、虚函数 定义:定义非常简单,只需要在...
  • Go 函数式选项模式

    2020-10-19 15:21:36
    本文译自 Functional Options Pattern in Go 版权@归原文所有. Golang 开发者遇到的许多问题之一是尝试将一个函数参数设置为可选. 这是一个非常常见的用例, 有些对象... 但是在 Golang 中, 这两种方式你哪个也用了.
  • 需要哪个模块。模块的作用是什么?abs() 函数返回数字的绝对值。abs() 方法的语法:abs( x )参数:x :数值表达式,可以是整数,浮点数,复数。返回值:函数返回 x(数字)的绝对值,如果参数是一个复数,...
  • ATTENTION:重载与函数的返回值类型无关,因为声明一个函数不需要返回类型,所以无法用来区分哪个函数 常函数和普通成员函数之间构成重载,重载时常对象调用常成员函数,一般对象调用一般成员函数 class A{ … ...
  • java 函数重载

    2012-11-07 22:20:58
    1、针对同一个类中的一个函数来说的;...5、在调用函数时会根据参数的类型和个数自动去匹配,决定调用哪个函数。这种匹配是不精确的,会找最精确的,如果没有最精确的,会找次精确的,以此类推,而且这种匹配不需要
  • 回调函数

    2011-12-14 10:50:00
    而由操作系统调用的一类函数,回调函数可以把调用者和被调用者分开,调用者(例如操作系统)不需要关心被调用者到底是哪个函数,它所知道的就是有这么一类函数,这类满足相同的函数签名(函数原型,参数,返回值等)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 500
精华内容 200
关键字:

哪个函数不需要参数