Error

C++博客 首页 新随笔 联系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks
// 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;
}
posted on 2017-04-04 13:11 Enic 阅读(837) 评论(0)  编辑 收藏 引用 所属分类: 从零开始写棋牌游戏平台cocos2d-x

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理