c/c++ 可变数量参数 参数包

c++11 参数包

c++11 有参数包,但是写的时候需要递归,写递归的终止函数

比如说,写了一个函数

template<class...Args>
string add_str(string a, Args...args)
{
    return a+add_str(args...);
}

还需要写他的终止函数只有有一个参数,或者无参数

1 只有一个参数:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>

using namespace std;

string add_str(string a)
{
    return a;
}

template<class...Args>
string add_str(string a, Args...args)
{
    return a + add_str(args...);
}


int main()
{
    string a = "1";
    string b = "2";
    string c = "3";
    string d = "4";
    string ans = add_str(a, b, c, d);
    cout << ans << endl;
    return 0;
}

2 无参数:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>

using namespace std;

string add_str()
{
    return "";
}

template<class...Args>
string add_str(string a, Args...args)
{
    return a + add_str(args...);
}

int main()
{
    string a = "1";
    string b = "2";
    string c = "3";
    string d = "4";
    string ans = add_str(a, b, c, d);
    cout << ans << endl;
    return 0;
}

c98 可变个数参数

另外一种是c的stdarg.h中的可变数量参数的方法

这种方法的缺点是你无法隐式的知道要处理多少个参数,你需要显示的指出来,你传的可变数量的参数有多少个,或者碰到什么样的就结束。

但是main函数也没给出有几个参数啊,他是怎么知道的??? 这个是怎么实现的。。。不晓得

int main(int argc, char **argv)

1 直接给出多少个

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <stdarg.h>

using namespace std;

string add_str(int n, ...)
{
    string s = "";
    va_list ap;
    va_start(ap, n);
    for (int i = 0; i < n; i++)
    {
        s += va_arg(ap, char*);
    }
    va_end(ap);
    return s;
}

int main()
{
    string a = "1";
    string b = "2";
    string c = "3";
    string d = "4";
    string ans = add_str(4, a.c_str(), b.c_str(), c.c_str(), d.c_str());
    cout << ans << endl;
    return 0;
}

2 以特殊字符结束

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <stdarg.h>

using namespace std;

string add_str(const char *a, ...)
{
    string s = a;
    va_list ap;
    va_start(ap, a);
    char *t= va_arg(ap, char*);
    while(strcmp(t, "")!=0)
    {
        s += t;
        t = va_arg(ap, char*);
    }
    va_end(ap);
    return s;
}

int main()
{
    string a = "1";
    string b = "2";
    string c = "3";
    string d = "4";
    string ans = add_str(a.c_str(), b.c_str(), c.c_str(), d.c_str(), "");
    cout << ans << endl;
    return 0;
}
文章目录