C++ 模板类,变长参数怎么做

C++ 模板类,变长参数如何做?
碰到个问题,比如我写一个 C++ 模板类:

C/C++ code

    template<typename ... TT> class CXXX



我想达到的目的是:参数类型、个数不确定,
那么在这个模板类的构造函数中,我如何得知传递进来的参数?

比如,在程序中用
C/C++ code

CXXX<RECT, ICONINFO> temp



来创建一个实例,怎样才能知道参数的类型和长度?
谢谢大家!

(问题能解决的话,分不够再加)

------解决方案--------------------
参考gcc tuple的实现方法

C/C++ code
  template<std::size_t _Idx, typename... _Elements>
    struct _Tuple_impl; 

  template<std::size_t _Idx>
    struct _Tuple_impl<_Idx>
    { 
    protected:
      void _M_swap_impl(_Tuple_impl&) { /* no-op */ }
    };

template<std::size_t _Idx, typename _Head, typename... _Tail>
    struct _Tuple_impl<_Idx, _Head, _Tail...>
    : public _Tuple_impl<_Idx + 1, _Tail...>,

------解决方案--------------------
使用 va_start 和 va_end 宏,例如
C/C++ code
/* va_start example */
#include <stdio.h>
#include <stdarg.h>

void PrintFloats ( int amount, ...)
{
  int i;
  double val;
  printf ("Floats passed: ");
  va_list vl;
  va_start(vl,amount);
  for (i=0;i<amount;i++)
  {
    val=va_arg(vl,double);
    printf ("\t%.2f",val);
  }
  va_end(vl);
  printf ("\n");
}

int main ()
{
  PrintFloats (3,3.14159,2.71828,1.41421);
  return 0;
}

------解决方案--------------------
探讨

VS2010 的 tuple 没有变长模板,连搜索“...” 都没有
C/C++ code

#include <tuple>

------解决方案--------------------
我在一个模板中见过这种写法,虽然不是任意长度的参数,但是基本上这种方式是比较简单的

C/C++ code

#define DELEGATE(TYPENAME_TEMPLATE_LIST,ARG_TYPE_LIST,ARG_PARAM_LIST,ARG_TYPE_PARAM_LIST) \
 \
template<typename RET TYPENAME_TEMPLATE_LIST> \
class IFunction<RET(ARG_TYPE_LIST)> \
..........................
template<typename RET TYPENAME_TEMPLATE_LIST> \
class MyTest<RET(ARG_TYPE_LIST)> \
..........................


#define TYPENAME_TEMPLATE_LIST_0
#define TYPENAME_TEMPLATE_LIST_1 TYPENAME_TEMPLATE_LIST_0 ,typename TT1
#define TYPENAME_TEMPLATE_LIST_2 TYPENAME_TEMPLATE_LIST_1 ,typename TT2
#define TYPENAME_TEMPLATE_LIST_3 TYPENAME_TEMPLATE_LIST_2 ,typename TT3

#define ARG_TYPE_LIST_0
#define ARG_TYPE_LIST_1 TT1
#define ARG_TYPE_LIST_2 ARG_TYPE_LIST_1 ,TT2
#define ARG_TYPE_LIST_3 ARG_TYPE_LIST_2 ,TT3

#define ARG_PARAM_LIST_0
#define ARG_PARAM_LIST_1 at1
#define ARG_PARAM_LIST_2 ARG_PARAM_LIST_1 ,at2
#define ARG_PARAM_LIST_3 ARG_PARAM_LIST_2 ,at3

#define ARG_TYPE_PARAM_LIST_0
#define ARG_TYPE_PARAM_LIST_1 TT1 at1
#define ARG_TYPE_PARAM_LIST_2 ARG_TYPE_PARAM_LIST_1 ,TT2 at2
#define ARG_TYPE_PARAM_LIST_3 ARG_TYPE_PARAM_LIST_2 ,TT3 at3

DELEGATE(TYPENAME_TEMPLATE_LIST_0,ARG_TYPE_LIST_0,ARG_PARAM_LIST_0,ARG_TYPE_PARAM_LIST_0)
DELEGATE(TYPENAME_TEMPLATE_LIST_1,ARG_TYPE_LIST_1,ARG_PARAM_LIST_1,ARG_TYPE_PARAM_LIST_1)
DELEGATE(TYPENAME_TEMPLATE_LIST_2,ARG_TYPE_LIST_2,ARG_PARAM_LIST_2,ARG_TYPE_PARAM_LIST_2)
DELEGATE(TYPENAME_TEMPLATE_LIST_3,ARG_TYPE_LIST_3,ARG_PARAM_LIST_3,ARG_TYPE_PARAM_LIST_3)

#undef TYPENAME_TEMPLATE_LIST_0
#undef TYPENAME_TEMPLATE_LIST_1
#undef TYPENAME_TEMPLATE_LIST_2
#undef TYPENAME_TEMPLATE_LIST_3

#undef ARG_TYPE_LIST_0
#undef ARG_TYPE_LIST_1
#undef ARG_TYPE_LIST_2
#undef ARG_TYPE_LIST_3

#undef ARG_PARAM_LIST_0
#undef ARG_PARAM_LIST_1
#undef ARG_PARAM_LIST_2
#undef ARG_PARAM_LIST_3

#undef ARG_TYPE_PARAM_LIST_0
#undef ARG_TYPE_PARAM_LIST_1
#undef ARG_TYPE_PARAM_LIST_2
#undef ARG_TYPE_PARAM_LIST_3