C/C++可变参数函数的实现

 更新时间:2020年04月01日 09:24:41   作者:嗨,人  
这篇文章主要介绍了C/C++可变参数函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、变长参数函数

头文件:#include <stdarg.h>

函数声明

int add(int count, ...); 

函数定义

int add(int count, ...)
{
 va_list va;
 va_start(va, count);
 int sum = 0;
 for (int i = 0; i < count; i++)
 sum += va_arg(va, int);
 va_end(va);
 return sum;
}

函数调用

int main()
{
 
 cout<<add(5, 1, 2, 3, 4, 5)<<endl;//输出15
 return 0;
}

二、C++11的新特性,变长参数模板。

边长参数模板相当于一个模板的递归展开模型,但是它不是递归的。使用的时候,要定义一个“递归”的出口,然后定义一系列的操作,操作的是以“递归”的方式进行的。

递归函数方式展开,模板推导的时候,一层层递归展开,最后到没有参数时用定义的一般函数终止。

void test()
 {
 cout << "test()" << endl;
 }

 template < class T, class... Args>
 void test(T first, Args... args)
 {
   cout << typeid(T).name() << " " << first <<endl;
   test(args...);
 }
test<int, int, long>(1, 2, 3L);
//输出
int 1
int 2
long 3
test()

嗯?第一个test()应该是作为test函数递归调用的结尾。再测试一下

template < class T>
 void test(const T &t)
 {
 cout << "test()"<<t << endl;
 }

 template < class T, class... Args>
 void test(T first, Args... args)
 {
   cout << typeid(T).name() << " " << first <<endl;
   test(args...);
 }
 //输出
int 1
int 2
test()3

这。。。。好像是通过第一个test来控制在哪里结束。

最后写一个正经的累加器:

#include <iostream>
#include <stdarg.h>
using namespace std;
template<typename T>
int add(const T& t)
{
 return t;
}
template<typename T, typename ...Args>
int add(const T& t, const Args&... args) 
{
 return t + add(args...);
}

int main() {
 auto res = add(2, 3, 3);
 std::cout << res << std::endl;
 system("pause");
 return 0;
}
//输出结果 8

三、参考

关于可变参数类模板、右值引用和完美转发的内容可以参考这篇博客https://www.jb51.net/article/95152.htm,有时间再研究下后面怎么做。

到此这篇关于C/C++可变参数函数的实现的文章就介绍到这了,更多相关C/C++可变参数函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文详解如何在VS Code上搭建C/C++开发环境

    一文详解如何在VS Code上搭建C/C++开发环境

    VSCode是由微软开发的一款免费、开源、跨平台的文本编辑器,它具有许多强大的功能,这篇文章主要给大家介绍了关于如何在VS Code上搭建C/C++开发环境的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • C++利用SQLite实现命令行工具

    C++利用SQLite实现命令行工具

    这篇文章主要为大家详细介绍了一个基于 C++、SQLite 和 Boost 库的简单交互式数据库操作 Shell,该 Shell 允许用户通过命令行输入执行各种数据库操作,感兴趣的可以了解下
    2023-11-11
  • C++ 初始化列表详解及实例代码

    C++ 初始化列表详解及实例代码

    这篇文章主要介绍了C++ 初始化列表详解及实例代码的相关资料,需要的朋友可以参考下
    2016-12-12
  • C++基本用法实践之模板详解

    C++基本用法实践之模板详解

    C++的模板是泛型编程思想的一种实现,模板不光支持函数模板,还有类模板等,本文主要来和大家聊聊C++中模板的相关用法,需要的可以参考一下
    2023-07-07
  • C语言实现任何文件的加密解密功能

    C语言实现任何文件的加密解密功能

    这篇文章主要为大家详细介绍了C语言实现任何文件的加密解密功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C语言实现桶排序的方法示例

    C语言实现桶排序的方法示例

    这篇文章主要介绍了C语言实现桶排序的方法,简单描述了桶排序的概念、原理并结合实例形式分析了C语言实现桶排序算法的具体操作技巧,需要的朋友可以参考下
    2018-01-01
  • C/C++字符串查找函数全面了解

    C/C++字符串查找函数全面了解

    下面小编就为大家带来一篇C/C++字符串查找函数全面了解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • GetChar缓存机制深入剖析

    GetChar缓存机制深入剖析

    以下是对GetChar缓存机制进行了详细的介绍,需要的朋友可以过来参考下
    2013-09-09
  • 老生常谈C语言动态函数库的制作和使用(推荐)

    老生常谈C语言动态函数库的制作和使用(推荐)

    下面小编就为大家带来一篇老生常谈C语言动态函数库的制作和使用(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • C语言 module_init函数与initcall案例详解

    C语言 module_init函数与initcall案例详解

    这篇文章主要介绍了C语言 module_init函数与initcall案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论