// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <cstdarg>
#include <vector>
// 变参函数例子
// 中不包含类型信息,不包含数量信息。相对优雅的解决方式有两个:
// 1.类似printf的方式,通过fmt字符串解决
// 2.类似cocos::Sequence::create的方式,应为全部是动画指针,所以类型是约定好的统一类型,结束标记可以使用NULL标记
void ParametListTest(
int nStart,
)
{
// 定义一个参数列表,用于接收解析""
va_list parametList;
// 输出第一个参数
std::cout << nStart << std::endl;
// nStart是‘’之前最后一个函数参数,用于内存定位,获取parametList
va_start(parametList, nStart);
// 里边的具体参数个数是获取不到的
// printf的处理和这里不一样:printf根据fmt字符串中的"%"标记来萃取参数类型、数量
int nTem = 0;
// 重parametList获取下一个类型为int的变量
nTem = va_arg(parametList,
int);
// -1作为结束标记
while (-1 != nTem)
{
std::cout << nTem << std::endl;
nTem = va_arg(parametList,
int);
}
va_end(parametList);
}
// 模版参数最后一个递归(带重载的递归)
void TParametListTest()
{
}
// C++ 1x变参模版
template<typename T, typename
Args>
void TParametListTest(T nStart, Args
args)
{
std::cout << nStart << std::endl;
// 可以直接展开多参数的定义
// 递归一次参数减少一个,最后会调用void重载
TParametListTest(args
);
}
int main()
{
// 假设需要实现的功能是输出,这个demo已经满足条件
// 假设需要实现的是类似cocos的时序动画功能,其实把std::cout换成成员变量,或者某个全局函数即可实现
ParametListTest(1, 2, 3, 3, 3, 3, -1);
std::cout << "----------------------------" << std::endl;
TParametListTest(1, 2, 3, 3, 3, 3); // 采用1X可变模版参数语法实现的,可以抹掉末尾的结束标记
return 0;
}