欢迎来到代码驿站!

C代码

当前位置:首页 > 软件编程 > C代码

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

时间:2021-06-10 08:23:14|栏目: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语言中指针 int *p=0;和int *p;*p=0;和”&“的关系和区别详解

栏    目:C代码

下一篇:详解C语言数组越界及其避免方法

本文标题:C/C++可变参数函数的实现

本文地址:http://www.codeinn.net/misctech/139021.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有